leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)
题目
https://leetcode.com/problems/transform-to-chessboard/
题解
没思路,看了答案。这道题没有套路,需要发现独特的规律,参考:
简单易懂的解法
【Python3】要么等于第一行 要么和第一行完全相反
代码是看着答案的思路,一句一句翻译过来的…详细原理见注释。
class Solution {public int movesToChessboard(int[][] board) {// 规则#1// 所有的"行",要么等于第0行,要么和第0行完全相反// 列也一样,但不需要去检查列,因为如果"行"合法,列必然合法,因此只需要判断"行"就行int N = board.length;boolean[] reverse = new boolean[N];for (int i = 1; i < N; i++) {reverse[i] = board[i][0] != board[0][0];}for (int i = 1; i < N; i++) {for (int j = 0; j < N; j++) {if (reverse[i] && board[i][j] == board[0][j]) return -1;}}// 规则#2// 每行的"1"的个数必须要么等于"0"的个数,要么相差1。因为规则#1已经通过,这次只要检查第0"行"就行。// 这次除了第0行,还需要检查第0列。int one = 0;for (int i = 0; i < N; i++) {if (board[0][i] == 1) one++;}if (Math.abs(N - 2 * one) > 1) return -1;one = 0;for (int i = 0; i < N; i++) {if (board[i][0] == 1) one++;}if (Math.abs(N - 2 * one) > 1) return -1;// 【计算交换次数】// 只需要计算第0行和第0列的交换次数就行,因为满足规则#1,所以剩下的行列肯定自动合法// 【首先,变换行】// (1)假设左上角单元格是0,则可推知整行的每个单元格。计算实际与目标的diff个数,如果diff为偶数,则变化次数为差异点个数的一半// (因为交换一次可以消除两个差异点)。如果diff为奇数,则无法变换为目标风格// (2)假设左上角单元格是1。同上。// (3)最后,选交换次数最小的作为行交换次数。// 【然后,变换列】// 列的变换算法和行没有任何差异,且行交换结果不影响列交换结果。// 【最后,行列交换次数相加】// 就是最终结果。int diffRow = 0;int swapRow;for (int i = 0; i < N; i++) { // 假设左上角为0,计算"行"交换个数if (i % 2 == 0) diffRow += board[0][i];else diffRow += (1 - board[0][i]);}if (diffRow % 2 == 0) {swapRow = diffRow / 2;if ((N - diffRow) % 2 == 0) swapRow = Math.min(swapRow, (N - diffRow) / 2); // N-diff是假设左上角为1的情况} else {swapRow = (N - diffRow) / 2;}// 行交换结果不影响列交换结果int diffCol = 0;int swapCol;for (int i = 0; i < N; i++) { // 假设左上角为0,计算"列"交换个数if (i % 2 == 0) diffCol += board[i][0];else diffCol += (1 - board[i][0]);}if (diffCol % 2 == 0) {swapCol = diffCol / 2;if ((N - diffCol) % 2 == 0) swapCol = Math.min(swapCol, (N - diffCol) / 2); // N-diff是假设左上角为1的情况} else {swapCol = (N - diffCol) / 2;}return swapRow + swapCol;}
}
leetcode 782. Transform to Chessboard | 782. 变为棋盘(Java)相关推荐
- 782 变为棋盘——Leetcode天天刷(2022.8.23)【数学:降维计算】
782 变为棋盘--Leetcode天天刷(2022.8.23)[数学:降维计算] 文章目录 782 变为棋盘--Leetcode天天刷(2022.8.23)[数学:降维计算] 前言 题目描述 示例 ...
- LeetCode·每日一题·782.变为棋盘·数学
链接:https://leetcode.cn/problems/transform-to-chessboard/solution/by-xun-ge-v-k6in/ 来源:力扣(LeetCode) 著 ...
- 图解LeetCode——782. 变为棋盘(难度:困难)
一.题目 一个 n * n 的二维网络 board 仅由 0 和 1 组成 .每次移动,你能任意交换两列或是两行的位置. 返回 将这个矩阵变为 "棋盘" 所需的最小移动次数 . ...
- Leetcode-第782题-困难-《变为棋盘》
题目 题目链接 一个 n × n n\times n n×n的二维网络 b o a r d board board仅由 0 0 0和 1 1 1组成 .每次移动,你能任意交换两列或是两行的位置. 返回 ...
- LeetCode 147. Insertion Sort List 链表插入排序 C++/Java
LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...
- LeetCode Top 100 Liked Questions 221. Maximal Square (Java版; Medium)
welcome to my blog LeetCode Top 100 Liked Questions 221. Maximal Square (Java版; Medium) 题目描述 Given a ...
- Codewars-The wheat/rice and chessboard problem(棋盘放谷粒)
棋盘放谷粒 科学作家大卫·布拉特纳说,从前,有一个骗子为高端客户制作棋盘--在这个例子中,他是一个国王. 工匠很好;他的棋盘不仅仅是漂亮.他知道,国王喜欢下棋.于是他想出一个计谋,骗国王交出一大笔财产 ...
- LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色
LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...
- 【leetcode】 剑指 Offer学习计划(java版本含注释)(上)
目录 前言 第一天(栈与队列) 剑指 Offer 09. 用两个栈实现队列(简单) 剑指 Offer 30. 包含min函数的栈(简单) 第二天(链表) 剑指 Offer 06. 从尾到头打印链表(简 ...
最新文章
- php 随机调用文章,zblog PHP调用热门文章、随机文章和热评文章代码
- 节省公司的宽带接入成本
- Eclipse内存分析工具的用法
- arm-linux-gcc 头文件搜索路径,gcc和arm-linux-gcc默认头文件库搜索路径
- jsp 防止sql注入 之 preparestatement篇(转载)
- 从零开始的异世界生活
- 如何实现从wgs-84到beijing54的坐标转换
- 微信小程序时间戳的转换及调用
- uniapp中引入colorUI
- linux文件的上传和下载(终端工具SCRT和XShell)
- 硬笔书法教学:看了都舍不得擦掉的粉笔字,网友纷纷夸赞“行走的打印机”
- 登录时记住密码的实现
- 01-简单的基于SVM的SAR海冰分离-Arcgis制作数据集标签
- java 数据内地地址_我国大陆居民×××Java验证
- Eplan绘图软件:西门子S7-1500部件
- 功能最强大的编辑器——vi
- 安卓投屏大师TC DS如何把手机声音传输到电脑教程
- wd移动硬盘不能识别_西部数据移动硬盘无法识别恢复
- 基于独立分量分析的语音信号盲源分离
- 遇到“服务器内部错误http500怎么办?