最少交换次数python_leetcode第200周赛第三题leetcode1536. 排布二进制网格的最少交换次数...

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

给你一个 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 。

方法:贪心+后缀0

思路:

首先我们考虑题意,成功变换之后,对于i行,这一行需要有n-i-1个后缀0,grid[i][i+1]......grid[i][-1]都为0。对于最后一行,不需要有后缀0。

由于我们只能变换相邻的两行,对于列是改变不了的。那么现存的每一行的后缀0的数量是不会改变的,因此,我们使用一个数组row_zeros,来保存每一行的后缀0数量,当需要交换的时候,只需要交换这个数组中的对应两行的值,而不需要交换grid,大大减少了时间复杂度。也就是说,在遍历完grid,计算出row_zeros之后,我们就不需要grid了。

下面我们考虑如何计算。因为越上面的行,对后缀0的要求越高,所以我们从i=0行开始往下遍历,直到倒数第二行(因为最后一行不需要)。遍历的过程中,可能出现几种情况:row_zeros[i] >= n-i-1;说明该行已经满足条件了,那么我们这一行就不需要替换了。(不用担心这一行抢了后面需要的行,因为后面的行要求肯定比这一行低。也不用担心这一行没有用更好的行,比如这一行后缀和要求5,这一行是5,后面还有一行后缀和是6,因为5已经满足了条件,后面的6一定可以满足它所对应的那一行的条件,不会造成影响,尽可能的少的进行行的变换。)

如果小于,那么这行需要互换,我们从这一行下面的i+1开始往后遍历,找到第一个满足条件的行(贪心,第一个找到的需要变换的次数最小)。然后将这一行往上一行一行交换到i行,交换的时候只需要互换row_zeros,交换使用res计数。

如果遍历到了末尾行还没找到满足要求的,那么说明答案不存在,直接返回-1。

遍历完所有行,返回计数的res。

代码:

Python3:

class Solution:

def minSwaps(self, grid: List[List[int]]) -> int:

res = 0

n = len(grid)

# row_zeros[i]表示i行的后缀0个数

row_zeros = [0] * n

# 遍历,填写row_zeros

for i in range(n):

for j in range(n-1,-1,-1):

if grid[i][j] == 0:

row_zeros[i] += 1

else:

break

# 从第一行开始遍历,到倒数第二行

for i in range(n-1):

# 如果该行的后缀0满足要求,pass

if row_zeros[i] >= n-i-1:

pass

# 不符合要求,从下一行开始,找到第一个满足条件的

else:

for j in range(i+1,n):

if row_zeros[j] >= n-i-1:

break

# 找到这一行,将符合条件这个一次一次往上面互换,换到i行

# 互换的时候,只需要互换row_zeros对应的值即可,不需要互换grid

if row_zeros[j] >= n-i-1:

for k in range(j,i,-1):

row_zeros[k],row_zeros[k-1] = row_zeros[k-1],row_zeros[k]

res += 1

# 如果没找到,说明不存在符合的i行的行,返回-1

else:

return -1

# 最后返回res

return res

cpp:

class Solution {

public:

int minSwaps(vector>& grid) {

int res = 0;

int n = grid.size();

// row_zeros[i]表示i行的后缀0个数 vector row_zeros(n,0);

// 遍历,填写row_zeros for (int i = 0; i < n; ++i)

for (int j = n-1;j > -1;--j){

if (grid[i][j] == 0)

row_zeros[i] += 1;

else break;

}

// 从第一行开始遍历,到倒数第二行 for (int i = 0; i < n-1; ++i){

// 如果该行的后缀0满足要求,pass if (row_zeros[i] >= n-i-1) continue;

// 不符合要求,从下一行开始,找到第一个满足条件的 else{

int j = i+1;

for (;j < n-1; ++j){

if (row_zeros[j] >= n-i-1){

break;

}

}

// 找到这一行,将符合条件这个一次一次往上面互换,换到i行 // 互换的时候,只需要互换row_zeros对应的值即可,不需要互换grid if (row_zeros[j] >= n-i-1){

for (int k = j; k > i; --k){

swap(row_zeros[k],row_zeros[k-1]);

res ++;

}

}

// 如果没找到,说明不存在符合的i行的行,返回-1 else return -1;

}

}

// 最后返回res return res;

}

};

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503564.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php常用功能代码,10段PHP常用功能代码(1)_PHP教程

1、使用PHP Mail函数发送Email$to "viralpatel.netgmail.com"; $subject "VIRALPATEL.net"; $body "Body of your message here you can use HTML too. e.g. &#xfe64;br&#xfe65; &#xfe64;b&#xfe65; Bold &#xfe64;/b&#xfe6…

如何避免_如何避免变频器受负载冲击

电工学习网&#xff1a;www.diangon.com关注电工学习网官方微信公众号“电工电气学习”&#xff0c;收获更多经验知识。为了保障变频器的安全运行&#xff0c;避免变频器受负载冲击&#xff0c;必须做好以下几点:㈠尽量保证变频器有充足的加减速时间变频器在开机或升速时&#…

哪种语言 连接 oracle,Go语言连接Oracle(就我这个最全)

综合参考了网上挺多的方案倒腾了半天终于连接好了Go都出来这么多年了还没有个Oracle的官方驱动。。。过程真的很蛋疼。。一度想放弃直接连ODBC首先交代一下运行环境和工具版本&#xff1a;WIN10MINGW64ORACLE INSTANCCLIENT_18_3 x64Jetbrins Goland看完这篇文章&#xff0c;…

补丁程序正在运行_针对微软4月14日更新补丁会导致蓝屏问题的检测及解决方法...

近期&#xff0c;我们接连收到用户求助&#xff0c;在使用电脑过程中会突然出现蓝屏问题&#xff0c;经火绒工程师分析发现&#xff0c;大部分用户出现蓝屏问题&#xff0c;是因为安装了微软于4月14日推送的补丁所致(详见下图)。目前微软方面表示正在调查相关问题。Win10系统蓝…

服务器访问oracle数据库,Oracle数据库的访问——通过不同服务器名对数据库的访问...

服务器端完成配置后&#xff0c;现在客户端可以通过不同的网络服务名配置来访问这个数据库&#xff0c;下面是一个配置示范&#xff1a;EYGLE(DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST 172.16.33.11)(PORT 1521)))(CONNECT_DATA (SERVICE_NAME eygle)))JU…

oracle质数怎么算,借花献佛之使用Oracle sql求质数(笔记)

首先声明一点&#xff0c;文章内容从itpub论坛上看到的&#xff0c;原文链接 http://www.itpub.net/thread-1849398-1-1.html&#xff0c;本文主要是记录下笔记&#xff0c;原文中有更详细的分析。使用sql求质素没什么实用价值&#xff0c;重要的是思路。(一)最简单的方法思路&…

商城html源码_Java开源商城源码推荐,从菜鸡到大神,永远绕不开的商城系统

每个Java程序员&#xff0c;从懵逼菜鸡&#xff0c;再到懵懂菜鸟&#xff0c;再到小鸟&#xff0c;大鸟&#xff0c;最后到技术大神&#xff0c;始终绕不开商城系统&#xff0c;里面蕴含了大量的业务&#xff0c;涉及到了大量的知识点和解决方案。今天锋哥介绍一款Java开源商城…

Oracle distinct后加as,【大话IT】为何加distinct之后就不走索引了

还是一样&#xff0c;16:45:44 SQL> l1 select site_id,2 count(*) sendnum3 from4 (select site_id,5 ewb_no6 from prod_send t7 where scan_time > to_date(2015-05-15, yyyy-mm-dd)8 and scan_time < to_date(2015-05-16, yyyy-mm-…

cpu只能单通道是什么表现_【小白入门】为什么要组内存双通道?

更新时间&#xff1a;2020年5月11日 内容提要&#xff1a; 1.内存双通道的原理 2.如何组双通道很多小白在购买内存的时候&#xff0c;不知道该购买一根单16G还是两根单8G&#xff0c;看完本篇文章你将知道内存双通道的优势。1.内存双通道的原理选择两根单8G组成双通道&#xff…

matlab 图像矢量量化,MATLAB环境下基于矢量量化的说话人识别系统(1)

第21卷第6期湖 北 工 业 大 学 学 报2006年12月Vol.21No.6 Journal of Hubei Univer sity of Technology Dec.2006[收稿日期]2006-10-13[作者简介]宋 敏(1979-),女,湖北武汉人,湖北工业大学硕士研究生,研究方向:计算机语音技术应用.[文章编号]1003-4684(2006)1220027203MATLAB …

雷云3灯光配置文件_雷蛇的哪种键盘最适合入手?3款最佳雷蛇键盘推荐。

更新时间2020.8.6本次主要内容是雷蛇的三款不同价位的雷蛇键盘推荐&#xff0c;有需要的小伙伴可以看一下哦&#xff0c;也许你想要入手的键盘就在其中。---------------------------------雷蛇黑寡妇蜘蛛精英版--------------------------------------黑寡妇蜘蛛精英版在猎魂光…

oracle窗帘位图索引,Greenplum数据库设计开发规范参考.docx

Greenplum数据库设计开发规范参考Greenplum数据库设计开发规范参考文档2016年7月目 录Greenplum数据库设计开发规范1V1.511 前言41.1 文档目的41.2 文档范围41.3 预期读者41.4 参考资料42 开发规范检查项43 GP与TD的差异关注点64 系统级设计74.1 用户设计74.1.1 超级用户84.1.2…

某些您可以编辑的区域交叠在一起 可能不能同时显示_DX200操作要领—修改与编辑程序(三十九)...

3.5 修改程序3.5.1 程序的调出1. 选择主菜单中的【程序内容】2. 选择【程序选择】–显示程序一览表。3. 选择要调出的程序3.5.2 程序相关画面程序相关画面有下面5种&#xff0c;可以确认/编辑每个程序的设定或登录。•程序标题画面显示和编辑注释、登录日期、编辑禁止的状态等。…

求二叉树中以x为根的子树的深度_还在玩耍的你,该总结啦!(本周小结之二叉树)...

给「代码随想录」一个星标吧&#xff01;❝有学习就要有总结❞本周小结本周赶上了十一国庆&#xff0c;估计大家已经对本周末没什么概念了&#xff0c;但是我们该做总结还是要做总结的。本周的主题其实是「简单但并不简单」&#xff0c;本周所选的题目大多是看一下就会的题目&a…

oracle (+)的可读性,Oracle基础笔记一

1.基本 SELECT 语句1.基本 SELECT 语句SELECT 标识 选择哪些列。FROM 标识从哪个表中选择。注意&#xff1a;SQL 语言大小写不敏感。SQL 可以写在一行或者多行关键字不能被缩写也不能分行各子句一般要分行写。使用缩进提高语句的可读性。2.算术运算符( - * /)数字和日期使…

钉钉功能介绍_平棉集团组织召开阿里钉钉办公系统基础功能培训会

4月11日上午&#xff0c;平棉集团在总部26楼多媒体会议室组织召开阿里钉钉办公系统基础功能培训会&#xff0c;邀请河南一一信息技术公司经理杨杉前来授课。集团公司董事长张先顺及公司领导陈亚民、王仲山、王向阳、陶尚林&#xff0c;各生产经营单位主管销售工作的负责人和公司…

qemu搭建arm运行linux内核,centos使用qemu搭建ARM64运行环境

准备工作(1) linux 内核源码&#xff0c; 从github上获取git clone https://github.com/torvalds/linuxmake kernelversion(2) 交叉编译工具&#xff0c;从linaro官网(www.linaro.org)上获取解压后设置环境变量即可xz -d gcc-linaro-xxx.tar.xztar -xvf gcc-linaro-xxx.tarexpo…

java 某年某月中第几周 开始时间和结束时间_重磅!库里又要签下一超级大合同!4年2亿啊!退役时间也定了...

好家伙&#xff01;现在的超级巨星都喜欢提前续约了&#xff0c;继詹姆斯与湖人签下两年8500万美元顶薪协议后&#xff0c;库里也有望达成这一成就。当地时间周一训练结束后&#xff0c;他接受采访谈到自己的续约问题&#xff0c;表示已经和球队交流过&#xff0c;同时明确表态…

vb ftp linux,VB FTP上传和下载模块

Option ExplicitPrivate Const INTERNET_OPEN_TYPE_DIRECT 1Private Const scuseragent "vb wininet"Private Const INTERNET_FLAG_PASSIVE &H8000000调用设置环境Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOp…

python struct pack一个数组_Python中struct.pack的一个疑问

展开全部的确很奇怪。我试验了10几分钟&#xff0c;你按下面的方法来做就可以正确。import structzzz ("{Type:2}").encode("utf-8")length len(zzz)a struct.pack("%ds"%length,zzz)print(a)简单的说32313133353236313431303231363533e59b9e…