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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 1536. 排布二进制网格的最少交换次数相关的知识,希望对你有一定的参考价值。


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

给你一个 ​​n x n​​​ 的二进制网格 ​​grid​​,每一次操作中,你可以选择网格的 相邻两行 进行交换。

一个符合要求的网格需要满足主对角线以上的格子全部都是 0

请你返回使网格满足要求的最少操作次数,如果无法使网格符合要求,请你返回 -1

主对角线指的是从 ​​(1, 1)​​​ 到 ​​(n, n)​​ 的这些格子。

示例 1:

LeetCode

输入:grid = [[0,0,1],[1,1,0],[1,0,0]]
输出:3

示例 2:

LeetCode

输入:grid = [[0,1,1,0],[0,1,1,0],[0,1,1,0],[0,1,1,0]]
输出:-1
解释:所有行都是一样的,交换相邻行无法使网格符合要求。

示例 3:

LeetCode

输入: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 1529. 最少的后缀翻转次数

某元素基态原子的最外层电子排布式为 ns2

LeetCode 1541. 平衡括号字符串的最少插入次数 栈

LeetCode 1611. 使整数变为 0 的最少操作次数

LeetCode 2167. 移除所有载有违禁货物车厢所需的最少时间