【leet-code】542. 01 矩阵
题目描述
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。
两个相邻元素间的距离为 1 。
示例 1:
输入:
0 0 0
0 1 0
0 0 0
输出:
0 0 0
0 1 0
0 0 0
示例 2:
输入:
0 0 0
0 1 0
1 1 1
输出:
0 0 0
0 1 0
1 2 1
注意:
- 给定矩阵的元素个数不超过 10000。
- 给定矩阵中至少有一个元素是 0。
- 矩阵中的元素只在四个方向上相邻: 上、下、左、右。
算法
可以用动态规划或者BFS,如果用DFS有超时的风险。
BFS
- 遍历matrix矩阵,将所有\(matrix[i][j]=0\)的位置信息\((i, j)\)保存到队列中,所有\(matrix[i][j]=1\)的将值从1改到定义的无穷大。
- 当队列不为空的时候,持续循环:
- 从队列中弹出一个元素,获取位置信息,将该位置(i,j)的上下左右做个判断,如果某个位置上的值大于matrix[i][j]+1,那么将该值改为matrix[i][j]+1,重新压入队列
- 进行改值操作的时候注意边界条件
BFS代码
#define INF 10000
class Solution {
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
int row = matrix.size();
if (row == 0)
return matrix;
int col = matrix[0].size();
queue<pair<int, int> > myQueue;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (matrix[i][j] == 0)
myQueue.push(pair<int, int>(i, j));
else
matrix[i][j] = INF;
}
}
while (!myQueue.empty())
{
pair<int, int> rec = myQueue.front();
myQueue.pop();
if (rec.first-1 >= 0 && matrix[rec.first-1][rec.second] > matrix[rec.first][rec.second]+1)
{
matrix[rec.first-1][rec.second] = matrix[rec.first][rec.second]+1;
myQueue.push(pair<int, int>(rec.first-1, rec.second));
}
if (rec.second-1 >= 0 && matrix[rec.first][rec.second-1] > matrix[rec.first][rec.second]+1)
{
matrix[rec.first][rec.second-1] = matrix[rec.first][rec.second]+1;
myQueue.push(pair<int, int>(rec.first, rec.second-1));
}
if (rec.first+1 < row && matrix[rec.first+1][rec.second] > matrix[rec.first][rec.second]+1)
{
matrix[rec.first+1][rec.second] = matrix[rec.first][rec.second]+1;
myQueue.push(pair<int, int>(rec.first+1, rec.second));
}
if (rec.second+1 < col && matrix[rec.first][rec.second+1] > matrix[rec.first][rec.second]+1)
{
matrix[rec.first][rec.second+1] = matrix[rec.first][rec.second]+1;
myQueue.push(pair<int, int>(rec.first, rec.second+1));
}
}
return matrix;
}
动态规划
基本的思想就是遍历matrix,如果matrix[i][j]是0的话,dp[i][j]直接为0,否则,它与四周的dp值有关,又因为从左上到右下的更新过程中,只能确定左上角两边的dp值;
所以要再从右下角往左上角遍历,这样就把dp[i][j]四周的dp值都考虑进去了。
动态规划代码
class Solution {
vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
// 两次遍历,左上到右下和右下到左上,更新完的dp就是最终的答案
int row = matrix.size();
if (row == 0)
return matrix;
int col = matrix[0].size();
vector<vector<int> > dp(row, vector<int>(col));
if (matrix[0][0] == 0)
dp[0][0] = 0;
else
dp[0][0] = INF;
// 第一次
for (int i = 1; i < col; i++)
{
if (matrix[0][i] == 0)
dp[0][i] = 0;
else
dp[0][i] = min(INF, dp[0][i-1] + 1);
}
for (int i = 1; i < row; i++)
{
if (matrix[i][0] == 0)
dp[i][0] = 0;
else
dp[i][0] = min(INF, dp[i-1][0] + 1);
}
for (int i = 1; i < row; i++)
{
for (int j = 1; j < col; ++j)
{
if (matrix[i][j] == 0)
dp[i][j] = 0;
else
dp[i][j] = min(INF, min(dp[i-1][j], dp[i][j-1]) + 1);
}
}
// 打印第一次更新成果
// for (int i = 0; i < row; i++)
// {
// for (int j = 0; j < col; j++)
// cout << dp[i][j] << ' ';
// cout << endl;
// }
//
// cout << "===========我是分割线===========" << endl;
// 第二次
for (int i = col - 2; i >= 0; i--)
{
if (matrix[row-1][i] == 0)
dp[row-1][i] = 0;
else
dp[row-1][i] = min(dp[row-1][i], dp[row-1][i+1] + 1);
}
for (int i = row - 2; i >= 0; i--)
{
if (matrix[i][col-1] == 0)
dp[i][col-1] = 0;
else
dp[i][col-1] = min(dp[i][col-1], dp[i+1][col-1] + 1);
}
for (int i = row - 2; i >= 0; i--)
{
for (int j = col - 2; j >= 0; j--)
{
if (matrix[i][j] == 1)
dp[i][j] = min(dp[i][j], min(dp[i+1][j], dp[i][j+1]) + 1);
}
}
return dp;
}
};
【leet-code】542. 01 矩阵的更多相关文章
- Java实现 LeetCode 542 01 矩阵(暴力大法,正反便利)
542. 01 矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 ...
- Leetcode 542.01矩阵
01矩阵 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 ...
- LeetCode——542. 01 矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出: 0 0 0 0 1 0 0 0 ...
- Leetcode 542:01 矩阵 01
Leetcode 542:01 矩阵 01 Matrix### 题目: 给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. 两个相邻元素间的距离为 1 . Given a matr ...
- leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
542. 01 Matrix https://www.cnblogs.com/grandyang/p/6602288.html 将所有的1置为INT_MAX,然后用所有的0去更新原本位置为1的值. 最 ...
- [EOJ Monthly 2018.10][C. 痛苦的 01 矩阵]
题目链接:C. 痛苦的 01 矩阵 题目大意:原题说的很清楚了,不需要简化_(:з」∠)_ 题解:设\(r_i\)为第\(i\)行中0的个数,\(c_j\)为第\(j\)列中0的个数,\(f_{i,j ...
- 【Leet Code】Palindrome Number
Palindrome Number Total Accepted: 19369 Total Submissions: 66673My Submissions Determine whether an ...
- MATLAB小函数:将列向量转化为0-1矩阵
MATLAB小函数:将列向量转化为0-1矩阵 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 将列向量转化为0-1矩阵,例如 A = 1 2 1 5 3 ...
- Leet Code 771.宝石与石头
Leet Code编程题 希望能从现在开始,有空就做一些题,自己的编程能力太差了. 771 宝石与石头 简单题 应该用集合来做 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S ...
随机推荐
- 用Python对html进行编码
原地址:https://stackoverflow.com/questions/275174/how-do-i-perform-html-decoding-encoding-using-python- ...
- 第四次OO总结
比较测试和正确性论证的效果 第13次作业是针对ALS电梯进行方法规格的测试,来判断方法运行的结果是否符合预期,是一种直观的验证错误的办法,但是不能确保程序完全正确,不过相比平时用的测试方法,这样效率更 ...
- 使用@Autowird注入报空指针异常
new的对象不能调用此对象里面注入的其他类,如果想要调用注入的其他类,则此new的对象要使用@componet将此类注入. 原因:
- 洛谷P2689 东南西北
https://www.luogu.org/problemnew/show/P2689 #include<iostream> #include<algorithm> using ...
- api controller 接口接收json字符串参数
{"data":{"alarmRepeatTimes":2,"currentMode":1,"moduleResetTimeout ...
- HDU - 1241 Oil Deposits 经典dfs 格子
最水的一道石油竟然改了一个小时,好菜好菜. x<=r y<=c x<=r y<=c x<=r y<=c x<=r y<=c #include ...
- 浮点数运算结果不精确,以及用String来构造BigDecimal进行浮点数精确计算
1.浮点数运算结果不精确 先看如下代码 System.out.println(1.0 - 0.8); System.out.println(0.2 + 0.1); System.out.println ...
- 架构(一)JDK安装
一 遇到的问题 问题1:安装jdk的时候,jdk解压失败? 我是通过wget http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b84 ...
- C++的学习心得
由于我们大一就学习的c++,跳过了c语言,VB的学习,在很多方面我们掌握的并不是特别好,在这几种语言中,几乎有时候会产生混淆,通过做大量的c++的题目感觉在题目中应用的最多的就是数组.指针.对类的应用 ...
- 使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境
在上一篇博客中,我介绍了如何在ubutnu 18.04中安装pyenv.这一次我将介绍如何使用pyenv与pyenv-virtualenv管理Python版本与虚拟环境. 0.相关命令 首先使用pye ...