LeetCode之排布二进制网格的最少交换次数(一千五百三十六)

举报
liuzhen007 发表于 2021/05/26 18:31:30 2021/05/26
【摘要】 目录 题目 解题 方法一、类比法 题目 (原题链接:https://leetcode-cn.com/problems/minimum-swaps-to-arrange-a-binary-grid/) 给你一个 n x n 的二进制网格 grid,每一次操作中,你可以选择网格的 相邻两行 进行交换。 一...

目录

题目

解题

方法一、类比法


题目

(原题链接:https://leetcode-cn.com/problems/minimum-swaps-to-arrange-a-binary-grid/

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

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

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

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

示例 1:

示例 2:

示例 3:

提示:

  • n == grid.length
  • n == grid[i].length
  • 1 <= n <= 200
  • grid[i][j] 要么是 0 要么是 1 。

解题

方法一、类比法

分析:该题仔细分析后,其实类比成排序问题,求解排序完成需要移动的次数。

代码:(C++)


  
  1. class Solution {
  2. public:
  3. int minSwaps(vector<vector<int>>& grid) {
  4. int n = grid.size(); //网格规模
  5. vector<int> a; //记录每一行后缀0的个数
  6. for (int i = 0; i < n; i++) {
  7. int count = 0;
  8. for (int j = n - 1; j >= 0; j--) {
  9. if (grid[i][j] == 0) {
  10. count++;
  11. }
  12. else {
  13. break;
  14. }
  15. }
  16. a.push_back(count);
  17. }
  18. int count = 0; //交换次数
  19. for (int i = 0; i < n - 1; i++) {
  20. if (a[i] >= n - i - 1) {
  21. continue;//满足条件,该行直接跳过
  22. }
  23. else {//不满足条件
  24. int j = i; //遍历满足条件的后缀0
  25. for (; j < n; j++) {
  26. if (a[j] >= n - i - 1) {
  27. break;
  28. }
  29. }
  30. if (j == n) {
  31. return -1; //找不到,直接返回-1
  32. }
  33. for (; j > i; j--) {
  34. swap(a[j], a[j - 1]); //每一行交换上去
  35. count++; //记录交换次数
  36. }
  37. }
  38. }
  39. return count;
  40. }
  41. };

时间复杂度:O(n*m)。

空间复杂度:O(n)。

执行结果:

 

文章来源: liuzhen.blog.csdn.net,作者:Data-Mining,版权归原作者所有,如需转载,请联系作者。

原文链接:liuzhen.blog.csdn.net/article/details/107803817

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。