Skip to content

M1536.排布二进制网格的最少交换次数

greedy, matrix, https://leetcode.cn/problems/minimum-swaps-to-arrange-a-binary-grid/

思路:统计后缀零后第一个1的位置再按行冒泡检查能否满足

cpp
class Solution {
public:
    int minSwaps(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int>col(n,-1);
        for (int i = 0; i < n; i++) {
            for (int j = n - 1; j >= 0; j--) {
                if (grid[i][j] == 1) {
                    col[i] = j;
                    break;
                }
            }
        }
        int ans = 0, check = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i; j < n; j++) {
                if (col[j] <= i) {
                    ans += (j - i);
                    for (int k = j; k > i; k--)
                        col[k] = col[k - 1];
                    goto nxt;
                }
            }
            return -1;
        nxt:
            ;
        }
        return ans;
    }
};

思路:简单的贪心, 统计每行的末尾0的个数即可

cpp
#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int minSwaps(vector<vector<int>>& grid) {
        int n = grid.size();
        vector<int> count_zeros(n, 0);
        for (int i = 0; i < n; i++) {
            for (int j = n - 1; j >= 0; j--) {
                if (grid[i][j] == 0) {
                    count_zeros[i]++;
                } else {
                    break;
                }
            }
        }

        int ans = 0;
        for (int i = 0; i < n; i++) {
            int col = -1;
            for (int j = i; j < n; j++) {
                if (count_zeros[j] >= n - 1 - i) {
                    col = j;
                    ans += col - i;
                    for (int k = col; k > i; k--) {
                        swap(count_zeros[k], count_zeros[k - 1]);
                    }
                    break;
                }
            }
            if (col == -1) {
                return -1;
            }
        }
        return ans;
    }
};

用时15min