题目

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)相关推荐

  1. 782 变为棋盘——Leetcode天天刷(2022.8.23)【数学:降维计算】

    782 变为棋盘--Leetcode天天刷(2022.8.23)[数学:降维计算] 文章目录 782 变为棋盘--Leetcode天天刷(2022.8.23)[数学:降维计算] 前言 题目描述 示例 ...

  2. LeetCode·每日一题·782.变为棋盘·数学

    链接:https://leetcode.cn/problems/transform-to-chessboard/solution/by-xun-ge-v-k6in/ 来源:力扣(LeetCode) 著 ...

  3. 图解LeetCode——782. 变为棋盘(难度:困难)

    一.题目 一个 n * n 的二维网络 board 仅由 0 和 1 组成 .每次移动,你能任意交换两列或是两行的位置. 返回 将这个矩阵变为  "棋盘"  所需的最小移动次数 . ...

  4. Leetcode-第782题-困难-《变为棋盘》

    题目 题目链接 一个 n × n n\times n n×n的二维网络 b o a r d board board仅由 0 0 0和 1 1 1组成 .每次移动,你能任意交换两列或是两行的位置. 返回 ...

  5. LeetCode 147. Insertion Sort List 链表插入排序 C++/Java

    LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...

  6. 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 ...

  7. Codewars-The wheat/rice and chessboard problem(棋盘放谷粒)

    棋盘放谷粒 科学作家大卫·布拉特纳说,从前,有一个骗子为高端客户制作棋盘--在这个例子中,他是一个国王. 工匠很好;他的棋盘不仅仅是漂亮.他知道,国王喜欢下棋.于是他想出一个计谋,骗国王交出一大笔财产 ...

  8. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  9. 【leetcode】 剑指 Offer学习计划(java版本含注释)(上)

    目录 前言 第一天(栈与队列) 剑指 Offer 09. 用两个栈实现队列(简单) 剑指 Offer 30. 包含min函数的栈(简单) 第二天(链表) 剑指 Offer 06. 从尾到头打印链表(简 ...

最新文章

  1. php 随机调用文章,zblog PHP调用热门文章、随机文章和热评文章代码
  2. 节省公司的宽带接入成本
  3. Eclipse内存分析工具的用法
  4. arm-linux-gcc 头文件搜索路径,gcc和arm-linux-gcc默认头文件库搜索路径
  5. jsp 防止sql注入 之 preparestatement篇(转载)
  6. 从零开始的异世界生活
  7. 如何实现从wgs-84到beijing54的坐标转换
  8. 微信小程序时间戳的转换及调用
  9. uniapp中引入colorUI
  10. linux文件的上传和下载(终端工具SCRT和XShell)
  11. 硬笔书法教学:看了都舍不得擦掉的粉笔字,网友纷纷夸赞“行走的打印机”
  12. 登录时记住密码的实现
  13. 01-简单的基于SVM的SAR海冰分离-Arcgis制作数据集标签
  14. java 数据内地地址_我国大陆居民×××Java验证
  15. Eplan绘图软件:西门子S7-1500部件
  16. 功能最强大的编辑器——vi
  17. 安卓投屏大师TC DS如何把手机声音传输到电脑教程
  18. wd移动硬盘不能识别_西部数据移动硬盘无法识别恢复
  19. 基于独立分量分析的语音信号盲源分离
  20. 遇到“服务器内部错误http500怎么办?

热门文章

  1. 小学计算机课程表说课稿,小学信息技术《制作课程表》说课稿.doc
  2. rss C语言,Android内存:VSS/RSS/PSS/USS介绍
  3. 通讯故障_伦茨lenze全数字直流调速器通讯故障维修经验很丰富
  4. 利用栈进行程序的括号匹配
  5. 线段树POJ3468(成段更新,区间求和)
  6. ZJOI2019一试翻车记
  7. cocos2d-x初探学习笔记(14)--菜单项
  8. 无ARP欺骗嗅探技术
  9. 读《Android 安全架构深究》
  10. 浅析ProcessBuilder