LeetCode 1536. 排布二进制网格的最少交换次数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1536. 排布二进制网格的最少交换次数相关的知识,希望对你有一定的参考价值。
1536. 排布二进制网格的最少交换次数
给你一个 n x n
的二进制网格 grid
,每一次操作中,你可以选择网格的 相邻两行 进行交换。
一个符合要求的网格需要满足主对角线以上的格子全部都是 0 。
请你返回使网格满足要求的最少操作次数,如果无法使网格符合要求,请你返回 -1 。
主对角线指的是从 (1, 1)
到 (n, n)
的这些格子。
示例 1:
输入:grid = [[0,0,1],[1,1,0],[1,0,0]]
输出:3
示例 2:
输入:grid = [[0,1,1,0],[0,1,1,0],[0,1,1,0],[0,1,1,0]]
输出:-1
解释:所有行都是一样的,交换相邻行无法使网格符合要求。
示例 3:
输入: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
。
二、方法一
贪心
class Solution
public int minSwaps(int[][] grid)
int n = grid.length;
int[] pos = new int[n];
Arrays.fill(pos, -1);
for (int i = 0; i < n; i++)
for (int j = n - 1; j >= 0; j--)
if (grid[i][j] == 1)
pos[i] = j;
break;
int res = 0;
for (int i = 0; i < n; i++)
int k = -1;
for (int j = i; j < n; j++)
if (pos[j] <= i)
res += j - i;
k = j;
break;
if (k >= 0)
for (int j = k; j > i; j--)
int temp = pos[j];
pos[j] = pos[j - 1];
pos[j - 1] = temp;
else
return -1;
return res;
复杂度分析
- 时间复杂度:O(n^2),其中 n 为网格的行数。预处理 \\textitpospos 数组需要 O(n^2)的时间复杂度,贪心计算答案需要 O(n^2)的时间复杂度,因此总时间复杂度为 O(n^2)。
- 空间复杂度:O(n)。pos 数组需要 O(n) 的空间。
以上是关于LeetCode 1536. 排布二进制网格的最少交换次数的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 1758. 生成交替二进制字符串的最少操作数
LeetCode 1541. 平衡括号字符串的最少插入次数 栈