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;
    }
};