1. 题目
给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换。
一个符合要求的网格需要满足主对角线以上的格子全部都是 0 。
请你返回使网格满足要求的最少操作次数,如果无法使网格符合要求,请你返回 -1 。
主对角线指的是从 (1, 1) 到 (n, n) 的这些格子。
输入:grid = [[0,0,1],[1,1,0],[1,0,0]]
输出:3
输入:grid = [[0,1,1,0],[0,1,1,0],[0,1,1,0],[0,1,1,0]]
输出:-1
解释:所有行都是一样的,交换相邻行无法使网格符合要求。
输入:grid = [[1,0,0],[1,1,0],[1,1,1]]
输出:0
提示:
n == grid.length
n == grid[i].length
1 <= n <= 200
grid[i][j] 要么是 0 要么是 1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-swaps-to-arrange-a-binary-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 找出每行末尾连续的0的个数
- 检查每行0的个数是否满足。不满足,往下找到第一个满足的,挪上去
class Solution {
public:
int minSwaps(vector<vector<int>>& grid) {
int i, j, sum = 0, n = grid.size(), ans = 0;
vector<int> num;
for(i = 0; i < n; ++i)
{
sum = 0;
for(j = n-1; j>=0 && grid[i][j]==0 ; --j)
sum++;
num.push_back(sum);//末尾连续0的个数
}
for(i = 0; i < n; ++i)
{
if(num[i] >= n-i-1)
continue;//0的个数够了,不动
j = i;
while(j < n && num[j] < n-i-1)
{ //往下找到一个0够多的
j++;
}
if(j == n)//没找到,返回-1
return -1;
while(num[i] < n-i-1)
{ //找到了,往上挪
swap(num[j], num[j-1]);
ans++;
j--;
}
}
return ans;
}
};
168 ms 25.9 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!