0782:变为棋盘(2429 分)
目录
题目
一个 n x n
的二维网络 board
仅由 0
和 1
组成 。每次移动,你能任意交换两列或是两行的位置。
返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换,输出 -1
。
“棋盘” 是指任意一格的上下左右四个方向的值均与本身不同的矩阵。
示例 1:
输入: board = [[0,1,1,0],[0,1,1,0],[1,0,0,1],[1,0,0,1]] 输出: 2 解释:一种可行的变换方式如下,从左到右: 第一次移动交换了第一列和第二列。 第二次移动交换了第二行和第三行。
示例 2:
输入: board = [[0, 1], [1, 0]] 输出: 0 解释: 注意左上角的格值为0时也是合法的棋盘,也是合法的棋盘.
示例 3:
输入: board = [[1, 0], [1, 0]] 输出: -1 解释: 任意的变换都不能使这个输入变为合法的棋盘。
提示:
n == board.length
n == board[i].length
2 <= n <= 30
board[i][j]
将只包含0
或1
相似问题:
分析
- 首先看第一行,0 和 1 的个数之差不能超过 1
- 然后看第二行,和第一行相比,要么完全相等,要么完全相反
- 后面的行同理,列也同理
- 然后计算行交换的次数
- 最后只可能得到两种结果:1 开始的交替序列,或 0 开始的交替序列
- 对每个序列,计算不同的位置个数 diff,如果 diff 是偶数,交换次数即是 diff//2
- 列交换次数同理,最后相加即可
解答
|
|
3 ms