1284:转化为全零矩阵的最少反转次数(1810 分)
目录
题目
给你一个 m x n 的二进制矩阵 mat。每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。相邻的两个单元格共享同一条边。
请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。
二进制矩阵 的每一个格子要么是 0 要么是 1 。
全零矩阵 是所有格子都为 0 的矩阵。
示例 1:

输入:mat = [[0,0],[0,1]] 输出:3 解释:一个可能的解是反转 (1, 0),然后 (0, 1) ,最后是 (1, 1) 。
示例 2:
输入:mat = [[0]] 输出:0 解释:给出的矩阵是全零矩阵,所以你不需要改变它。
示例 3:
输入:mat = [[1,0,0],[1,0,0]] 输出:-1 解释:该矩阵无法转变成全零矩阵
提示:
m == mat.lengthn == mat[0].length1 <= m <= 31 <= n <= 3mat[i][j]是 0 或 1 。
相似问题:
分析
#1
把整个矩阵看作状态,即是典型的 bfs
|
|
7 ms
#2
还有更优的做法
- 注意到只要确定了第一行翻转哪些格子,为了保证全零,后面的都只有一种选法
- 因此,枚举第一行翻转的子集,确定后面的翻转格子,判断能否全零即可
- m 比 n 小时,可以转置矩阵,节省时间
解答
|
|
0 ms