LeetCode 5282. 转化为全零矩阵的最少反转次数
地址 https://leetcode-cn.com/problems/minimum-number-of-flips-to-convert-binary-matrix-to-zero-matrix/
题目描述
给你一个 m x n 的二进制矩阵 mat。
每一步,你可以选择一个单元格并将它反转(反转表示 0 变 1 ,1 变 0 )。如果存在和它相邻的单元格,那么这些相邻的单元格也会被反转。(注:相邻的两个单元格共享同一条边。)
请你返回将矩阵 mat 转化为全零矩阵的最少反转次数,如果无法转化为全零矩阵,请返回 -1 。
二进制矩阵的每一个格子要么是 0 要么是 1 。
全零矩阵是所有格子都为 0 的矩阵。
示例 :
输入:mat = [[,],[,]]
输出:
解释:一个可能的解是反转 (, ),然后 (, ) ,最后是 (, ) 。
示例 : 输入:mat = [[]]
输出:
解释:给出的矩阵是全零矩阵,所以你不需要改变它。
示例 : 输入:mat = [[,,],[,,],[,,]]
输出:
示例 : 输入:mat = [[,,],[,,]]
输出:-
解释:该矩阵无法转变成全零矩阵
提示: m == mat.length
n == mat[].length
<= m <=
<= n <=
mat[i][j] 是 或 。
算法1
本题同acwing 95. 费解的开关 acwing116. 飞行员兄弟 类似
可以考虑第一层如何全零的时候 需要按那几个开关 第二层为如何全零的时候需要按那几个开关 依次推到至最后一层得到答案
在数据范围比较大的情况也可以采用 双向BFS 进行搜索范围的优化
由于范围比较小 我就采取了比较粗暴的朴素BFS
从全零的状态作为起点 依次BFS 看看走到题目给出的状态 需要几步
简单直接
用来做记录状态的key 直接使用二维数组 而没有进行压缩变形
不过代码也比较好理解
代码如下:
class Solution {
public: map<vector<vector<int>>, int> visit;
queue<pair<vector<vector<int>>, int>> q;
bool CheckIsAllZero(const vector<vector<int>> &mat)
{
for (int i = ; i < mat.size(); i++) {
for (int j = ; j < mat[].size(); j++) {
if (mat[i][j] != )
return false;
}
} return true;
} void Click(vector<vector<int>>& currenrState, int x, int y)
{
int addx[] = { ,-,, };
int addy[] = { ,,-, }; currenrState[x][y] = currenrState[x][y] ? : ; for (int i = ; i < ; i++) {
int newx = x + addx[i];
int newy = y + addy[i]; if (newx >= && newx < currenrState.size() && newy >= && newy < currenrState[].size()) {
currenrState[newx][newy] = currenrState[newx][newy] ? : ;
}
}
} int minFlips(vector<vector<int>>& mat) {
if (CheckIsAllZero(mat)) return ; vector<vector<int>> matAllZero(mat.size(), vector<int>(mat[].size())); int distance = ; visit[matAllZero] = distance;
q.push({ matAllZero ,distance }); while (!q.empty()) {
auto qe = q.front();
q.pop();
vector<vector<int>> currenrState = qe.first;
int currentCount = qe.second; //尝试 点击该XY
for (int i = ; i < currenrState.size(); i++) {
for (int j = ; j < currenrState[].size(); j++) {
vector<vector<int>> copy = currenrState;
Click(copy, i, j); if (copy == mat)
{
return currentCount + ;
} if (visit.count(copy) == ) {
q.push({ copy ,currentCount + });
visit[copy] = currentCount + ;
}
}
}
} return -;
} };
LeetCode 5282. 转化为全零矩阵的最少反转次数的更多相关文章
- leetcode1284 转化为全零矩阵的最少反转次数
m == mat.length n == mat[0].length 1 <= m <= 3 1 <= n <= 3 mat[i][j] 是 0 或 1 . BFS, 代码来自 ...
- [LeetCode] Minimum Moves to Equal Array Elements 最少移动次数使数组元素相等
Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...
- [LeetCode] Minimum Moves to Equal Array Elements II 最少移动次数使数组元素相等之二
Given a non-empty integer array, find the minimum number of moves required to make all array element ...
- LeetCode:最少移动次数使得数组元素相等||【462】
LeetCode:最少移动次数使得数组元素相等||[462] 题目描述 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最 ...
- Leetcode 462.最少移动次数使数组元素相等
最少移动次数使数组元素相等 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输入: [1,2, ...
- Java实现 LeetCode 462 最少移动次数使数组元素相等 II
462. 最少移动次数使数组元素相等 II 给定一个非空整数数组,找到使所有数组元素相等所需的最小移动数,其中每次移动可将选定的一个元素加1或减1. 您可以假设数组的长度最多为10000. 例如: 输 ...
- leetcode 1541. 平衡括号字符串的最少插入次数
问题描述 给你一个括号字符串 s ,它只包含字符 '(' 和 ')' .一个括号字符串被称为平衡的当它满足: 任何左括号 '(' 必须对应两个连续的右括号 '))' . 左括号 '(' 必须在对应的连 ...
- 面试官:你有m个鸡蛋,如何用最少的次数测出鸡蛋会在哪一层碎?
假设你面前有一栋n层的大楼和m个鸡蛋,假设将鸡蛋从f层或更高的地方放扔下去,鸡蛋才会碎,否则就不会.你需要设计一种策略来确定f的值,求最坏情况下扔鸡蛋次数的最小值. leetcode原题链接 乍一看这 ...
- 面试题:对一个正整数n,算得到1需要的最少操作次数
实现一个函数,对一个正整数n,算得到1需要的最少操作次数.操作规则为:如果n为偶数,将其除以2:如果n为奇数,可以加1或减1:一直处理下去.例子:func(7) = 4,可以证明最少需要4次运算n = ...
随机推荐
- 学习笔记31_ORM框架ModelFirst设计数据库
ModelFirst就是先设计实体数据类型,然后根据设计的数据类型,生成数据库表 1.新建项--ADO.NET实体数据模型--空数据模型--进入模型设计器(点击xxx.edmx文件也能进入设计器). ...
- 【AtCoder - 5659 】>< (思维题)
>< 直接写中文了 Problem Statement 给定的是长度为N-1的字符串S. S中的每个字符都是<或>. 当对所有i(1≤i≤N-1)都满足以下条件时,N个非负整数 ...
- 20190820 Tue 集训总结&NOIP模拟 27
低谷度过了? 但是skyh阿卡了,还是反衬出我的辣鸡. T1知道要sort,却忘了判重,正解不如暴力分高,555. T2成功化出正解柿子,然后化过头了,化出了无法DP的柿子. 果然不够强,大神们一眼就 ...
- python私有变量的分类
- 格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法
格式工厂转化成mp4 avc格式 暴风影音不能播放的解决方法 先转成其他mp4 确保能播放 然后再转成avc
- (数据科学学习手札71)在Python中制作个性化词云图
本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 一.简介 词云图是文本挖掘中用来表征词频的数据可视化 ...
- js常用的array方法
1. splice() splice()方法向/从数组中添加/删除项目,然后返回被删除的项目.(注释:该方法会改变原始数组.) arrayObject.splice(index,howmany,i ...
- C++中对C的扩展学习新增语法——作用域运算符::
作用域运算符用来告诉编译器在哪个作用域范围搜索符号,一般分为以下3种: 全局作用域: 命名空间作用域: 类作用域:
- [内部类] java笔记之内部类
1.内部类的分类 2.成员内部类的定义格式 3.一旦使用了内部类,那么生成的class文件长啥样? 其中Body是外部类,Heart是Body的内部类,所以中间有个美元符号$,所以给类进行命名时,不要 ...
- 高质量App的架构设计与思考!
最近在做一功能不大.业务也不复杂的小众App,以往做App是发现自己从来没有考虑过一些架构方面的问题,只是按照自己以往的习惯去写代码,忽略了App的设计.本次分享主要包含一些开发App的小经验和技巧, ...