Leetcode782 变为棋盘

一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能任意交换两列或是两行的位置。

返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换,输出 -1。

“棋盘” 是指任意一格的上下左右四个方向的值均与本身不同的矩阵。
在这里插入图片描述

输入: board = [[0,1,1,0],[0,1,1,0],[1,0,0,1],[1,0,0,1]]
输出: 2
解释:一种可行的变换方式如下,从左到右:
第一次移动交换了第一列和第二列。
第二次移动交换了第二行和第三行。

解:
棋盘的合法性:
首先要考虑到棋盘的合法性,如果第一行为10101,那么第二行就为01010,第三行就和第一行相同。所以要么和第一行相同,要么和第一行完全相反。期盼才是合法的。
在这里插入图片描述
然后从整体看,分为偶数和奇数类型,我们可以看到四个角要么是0101,要么是全为1或全为0.那么如果不符合这个,棋盘业不合法。

    public int movesToChessboard(int[][] board) {if (!check(board)) {return -1;}int[] col = new int[board.length];for (int i = 0; i < board.length; i++) {col[i] = board[i][0];}return getSwapCount(board[0]) + getSwapCount(col);}/*** 检查合法性 分别检查行和列** @param board 数组* @return*/public boolean check(int[][] board) {return checkFirstRow(board) &&checkFirstCol(board) &&checkRow(board) &&checkCol(board);}public boolean checkFirstRow(int[][] board) {int rowOneCnt = 0;int rowZeroCnt = 0;int[] first = board[0];for (int num : first) {if (num == 0) {rowZeroCnt++;} else {rowOneCnt++;}}return rowOneCnt == rowZeroCnt || Math.abs(rowOneCnt - rowZeroCnt) == 1;}public boolean checkFirstCol(int[][] board) {int oneCnt = 0, zeroCnt = 0;for (int i = 0; i < board.length; i++) {if (board[i][0] == 0) {zeroCnt++;} else {oneCnt++;}}return oneCnt == zeroCnt || Math.abs(oneCnt - zeroCnt) == 1;}public boolean checkRow(int[][] board) {//第一行当做哨兵 其他的行要么和第一行相等 要么和第一行相反//如:第一行0110 后续的行只能是 0110、1001int[] sentinel = board[0];int sameCnt = 0, oppositeCnt = 0;for (int[] cur : board) {//相同if (sentinel[0] == cur[0]) {for (int i = 0; i < sentinel.length; i++) {if (sentinel[i] != cur[i]) {return false;}}sameCnt++;} else {//相反for (int i = 0; i < sentinel.length; i++) {if (sentinel[i] + cur[i] != 1) {return false;}}oppositeCnt++;}}return sameCnt == oppositeCnt || Math.abs(sameCnt - oppositeCnt) == 1;}public boolean checkCol(int[][] board) {//第一列当做哨兵 其他的列要么和第一列相等 要么和第一列相反//如:第一列0110 后续的列只能是 0110、1001int sameCnt = 0, oppositeCnt = 0;int[] sentinel = new int[board.length];for (int j = 0; j < board.length; j++) {sentinel[j] = board[j][0];}for (int j = 0; j < board.length; j++) {if (board[0][j] == sentinel[0]) {for (int i = 0; i < sentinel.length; i++) {if (sentinel[i] != board[i][j]) {return false;}}sameCnt++;} else {for (int i = 0; i < sentinel.length; i++) {if (sentinel[i] + board[i][j] != 1) {return false;}}oppositeCnt++;}}return sameCnt == oppositeCnt || Math.abs(sameCnt - oppositeCnt) == 1;}private int getSwapCount(int[] sentinel) {//假设都是10101010...int preNum = 1;int errorCnt = 0;for (int i : sentinel) {//统计有多少错位if (i != preNum) {errorCnt++;}preNum = preNum == 1 ? 0 : 1;}//数组是偶数个还是奇数个if (sentinel.length % 2 == 0) {//偶数个 可以是01010101 或者 10101010return Math.min(sentinel.length - errorCnt, errorCnt) / 2;} else {//奇数个 取决于1多还是0多 1多则是1 0 1 0 1 0 1 0 1 、0多则是0 1 0 1 0 1 0 1 0//并且错误的个数一定是偶数个if (errorCnt % 2 == 0) {return errorCnt / 2;} else {return (sentinel.length - errorCnt) >> 1;}}}

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/transform-to-chessboard
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

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

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

相关文章

洛谷P8840 Java题解

题目描述 花栗鼠科技大学的计算机组成原理实验最终的结课考核方式是提交一份报告。 然而作为任课老师&#xff0c;萝老师不希望大家过于内卷&#xff0c;所以指定了如下规定&#xff1a; 每份报告有一个卷面基础分 aa。 在此基础上&#xff1a; 若是报告字数低于 1616 页&a…

[博学谷学习记录] 超强总结,用心分享|JavaEE就业课-尊享无忧+Java基础语法|面向对象(2wk)

目录 面向对象 类和对象的关系 对象的使用​编辑 垃圾回收 局部变量和成员变量 private 关键字 this 关键字 封装&#xff08;三大面向对象特征之一&#xff09; 构造方法 构造方法格式 执行时机 构造方法的注意事项 标准类制作 面向对象 类和对象的关系 类:类是…

晶灿钻石宝可梦总结

你知道哪个世代的宝可梦最强吗&#xff1f; 【宝可梦晶灿钻石明亮珍珠29】全道具获取收集地点合集攻略&#xff01; 骑拉帝纳 宝可梦晶灿钻石明亮珍珠美纳斯怎么获得 丑丑鱼在哪里捕捉 https://serebii.net/ 杂谈21——打了3小时冠军&#xff0c;我终于过了珍钻复刻一周目…

安卓启动模式

使用任务栈来储存创建的Activity&#xff0c;栈是先进后出 1.标准模式 standard 默认 2.栈顶模式-singletop 栈顶存在 则复用 3.栈内复用-singletask 会将要复用的activity上边的实例全部出栈&#xff0c;随后将其置顶 4.单例-singleInstance 如果设置某个activity为 此默认…

安卓开发-动画

动画 视图动画&#xff1a;将逐帧动画和补间动画统称为视图动画&#xff0c;用于指定控件的动画 逐帧动画&#xff1a;以xml或者代码的方式&#xff0c;实现多帧动画的播放 补间动画&#xff1a;对控件可以进行移动、旋转、缩放等操作 属性动画&#xff1a;通过改变控件的某…

诚之和:盗本、洗稿…剧本杀火热背后的版权之痛盗版正版同天发售

胖丁是一位传统文学作者&#xff0c;同时也是寒炉文化总监制、剧堆创始人。2020年&#xff0c;他带着新发行的剧本《少儿不宜》在重庆参加一场展会&#xff0c;但始料未及的是&#xff0c;展会结束后一周&#xff0c;胖丁就在不少电商平台、二手平台上发现了自己的同款剧本。 …

安卓viewpager联动方案

ViewPager 联动方案&#xff1a; 1.通过ViewPager1计算出滑动的距离&#xff0c;将此距离在给ViewPager2滑动 ViewPager1滑动距离&#xff1a;滑动初始页到左右边距的距离&#xff1b; distancepositon*View.getWidth()oisutuibOffsetPixels 2.通过设置ViewPager2的scrollT…

常见面试题总结

JAVA篇 1.什么是面向对象&#xff1f;面向对象的优点 只需要关注每个对象具体做了什么&#xff0c;调用操作可以进行封装&#xff0c;更加易于复用、扩展和维护。 三大特点&#xff1a; 封装-明确标识允许外部调用的方法&#xff0c;无需关注内部实现&#xff08;例如get/s…

原生html+css+js制作宠物小精灵icon

前言 上百个pokemon icon&#xff0c;纯htmlcss绘制&#xff0c;分享给大家&#xff01; 文章目录 前言一、皮卡丘1.皮卡丘2.雷丘 二、妙蛙种子1.妙蛙种子2.妙蛙草3.妙蛙花 三、小火龙1.小火龙2.火恐龙3.喷火龙 四、杰尼龟1.杰尼龟2.卡咪龟3.水箭龟 五、胖丁1.胖丁2.胖可丁 …

【MySQL】数据库多表操作通关教程(外键约束、多表联合查询)

&#x1f481; 个人主页&#xff1a;Nezuko627的博客主页 ❤️ 支持我&#xff1a;&#x1f44d; 点赞 &#x1f337; 收藏 &#x1f918;关注 &#x1f38f; 格言&#xff1a;一步一个脚印才能承接所谓的幸运 本文来自专栏&#xff1a;MySQL8.0学习笔记 本文参考视频&#xff…

vuex -- 数组对象的“双向数据绑定”

vuex不允许在组件内部直接修改共享数据&#xff0c;需要在mutations中修改数据&#xff0c;所以涉及到双向绑定不能使用v-model &#x1f4a1; 需求 需要增加&#xff0c;删除数据&#xff0c;并且可以修改每一项的done 步骤 在state中提供一个对象数组 state: {list: [{i…

自动驾驶什么时候才会凉凉,估计还要多久?

作者&#xff1a;哆啦胖丁 链接&#xff1a;https://www.zhihu.com/question/404870865/answer/1364318345 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 我会觉得在自动驾驶这一块&#xff0c;大家都有这么一个共…

你所不知道 ❌ Resource

前言 找我请到 掘金 或者 Github 自己也维护不过来那么多站点&#xff0c;对不住大家了。 ? 更新平台多偶尔会漏掉&#xff0c;如果觉得文章还行点个 star 防走失。 你所不知道 ❌ 系列一起探索未知 很久没写文章了&#xff0c;在新的公司新的遇到了新的伙伴&#xff0c;胖丁哥…

js画一条快乐的胖丁鱼

朋友echarts周围要花一个像时钟一样的光圈&#xff0c;突发奇想像画一条&#x1f41f;&#xff0c;然后就有了这篇博客&#xff0c;有时间&#xff0c;你还可以画一张你喜欢的小可爱的脸&#xff0c;把里面的东西稍微改动下&#xff0c;就可以有个嘴巴&#xff0c;耳朵&#xf…

三端取图小程序后端源码

简介&#xff1a; 后端&#xff1a;开发使用bootstrap框架&#xff0c;源码无加密&#xff0c;程序中预留位置 可拓展为支持创作者入驻取图小程序&#xff0c;接口使用json传送数据&#xff0c;未进行加密。 前端&#xff1a;三端程序使用uniapp开发&#xff0c;前端源码中仅…

latex 制作个人简历,CV

用 latex 写的简历&#xff0c;效果比 word 好很多&#xff0c;见下面效果图&#xff1a; 推荐大家用 overleaf 中的简历模板来做&#xff0c;https://www.overleaf.com/gallery/tagged/cv&#xff0c; 上面有成千上万个模板。 插图中的模板网址是&#xff1a;https://www.ove…

几个著名的3D测试场景与模型

来自&#xff1a;http://tieba.baidu.com/p/2516805630 Sponza Atrium&#xff08;Marko Dabrovic版&#xff09; 由来自Lightwave的Marko Dabrovic于2002年创建&#xff0c;原型是位于克罗地亚南部港口城市杜布罗夫尼克的著名旅游景点、有400余年历史的Sponza宫。因其发杂又易…

兰州数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

兰州数字孪生工厂3D模型&#xff0c;三维可视化建模&#xff0c;三维虚拟仿真交互模型。三维可视化建模技术是将实物或假想物1:1真实感三维渲染到计算机上的技术。三维可视化建模技术是未来建设智能单元、智能生产线、智能车间、智能工厂、三维可视化数字孪生系统的基础。 三维…

青岛数字孪生工厂3D模型,三维可视化建模,三维虚拟仿真交互模型

青岛数字孪生工厂3D模型&#xff0c;三维可视化建模&#xff0c;三维虚拟仿真交互模型。3D可视化建模引擎可助力企业快速构建智慧工厂三维可视化平台&#xff0c;拖过在线拖拉拽模型组件的方式&#xff0c;轻松搭建工厂三维场景&#xff0c;通过三维可视化手段对工厂各类设备进…

芜湖3d可视化建模,数字孪生智慧工厂3D模型开发,智慧城市园区三维模型

芜湖3d可视化建模&#xff0c;数字孪生智慧工厂3D模型开发&#xff0c;智慧城市园区三维模型。随着5G时代物联网数字孪生3D可视化的发展&#xff0c;芜湖3d可视化建模&#xff0c;数字孪生智慧工厂3D模型开发&#xff0c;智慧城市园区三维仿真模型在场景应用方面也越来越广泛。…