[Leetcode] 542. 01 Matrix 解题报告
来源:互联网 发布:跆拳道泰拳知乎 编辑:程序博客网 时间:2024/05/05 11:30
题目:
Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell.
The distance between two adjacent cells is 1.Example 1:
Input:
0 0 00 1 00 0 0Output:
0 0 00 1 00 0 0
Example 2:
Input:
0 0 00 1 01 1 1Output:
0 0 00 1 01 2 1
Note:
- The number of elements of the given matrix will not exceed 10,000.
- There are at least one 0 in the given matrix.
- The cells are adjacent in only four directions: up, down, left and right.
思路:
1、DFS:我们从每个值为0的格子开始进行DFS搜索,首先将当前格子的最近距离置为dist,然后朝四个方向进行搜索即可。需要注意的是,如果当前格子的值为0,那么需要将dist重置为0才可以。
2、BFS:用pair<int, int>来填充队列,其中第一个int标识格子所处的位置,第二个int标识当前格子距离0的最近距离。我们首先将所有0的位置的格子都加入队列中,然后依次处理队列中的每个元素。注意只有当ret[r][c] > dist的时候才需要更新ret[r][c]的值,并同时将其符合条件的邻居加入队列中,否则什么都不需要做。这样可以实现很有效的剪枝,大大提高效率。
代码:
1、DFS:
class Solution {public: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; } int row_num = matrix.size(), col_num = matrix[0].size(); vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX)); for (int r = 0; r < row_num; ++r) { for (int c = 0; c < col_num; ++c) { if (matrix[r][c] == 0) { DFS(matrix, ret, r, c, 0); } } } return ret; }private: void DFS(vector<vector<int>> &matrix, vector<vector<int>> &ret, int row, int col, int dist) { int row_num = matrix.size(), col_num = matrix[0].size(); if (row < 0 || row >= row_num || col < 0 || col >= col_num || ret[row][col] <= dist) { return; } if (matrix[row][col] == 0) { dist = 0; } ret[row][col] = dist; DFS(matrix, ret, row - 1, col, dist + 1); DFS(matrix, ret, row + 1, col, dist + 1); DFS(matrix, ret, row, col - 1, dist + 1); DFS(matrix, ret, row, col + 1, dist + 1); }};
2、BFS:
class Solution {public: vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) { if (matrix.size() == 0 || matrix[0].size() == 0) { return {}; } int row_num = matrix.size(), col_num = matrix[0].size(); vector<vector<int>> ret(row_num, vector<int>(col_num, INT_MAX)); queue<pair<int, int>> q; // {r * col_num + c, dist} for (int r = 0; r < row_num; ++r) { for (int c = 0; c < col_num; ++c) { if (matrix[r][c] == 0) { q.push(make_pair(r * col_num + c, 0)); } } } while (!q.empty()) { pair<int, int> p = q.front(); q.pop(); int r = p.first / col_num, c = p.first % col_num, dist = p.second; if (ret[r][c] > dist) { ret[r][c] = dist; if (r - 1 >= 0 && matrix[r - 1][c] == 1 && ret[r - 1][c] > dist + 1) { q.push(make_pair((r - 1) * col_num + c, dist + 1)); } if (r + 1 < row_num && matrix[r + 1][c] == 1 && ret[r + 1][c] > dist + 1) { q.push(make_pair((r + 1) * col_num + c, dist + 1)); } if (c - 1 >= 0 && matrix[r][c - 1] == 1 && ret[r][c - 1] > dist + 1) { q.push(make_pair(r * col_num + c - 1, dist + 1)); } if (c + 1 < col_num && matrix[r][c + 1] == 1 && ret[r][c + 1] > dist + 1) { q.push(make_pair(r * col_num + c + 1, dist + 1)); } } } return ret; }};
阅读全文
0 0
- [Leetcode] 542. 01 Matrix 解题报告
- 【LeetCode】01 Matrix 解题报告
- [LeetCode]Spiral Matrix,解题报告
- [LeetCode] Spiral Matrix 解题报告
- LeetCode: Spiral Matrix 解题报告
- 01 Matrix解题报告
- 【LeetCode】Set Matrix Zeroes 解题报告
- [leetcode] 54. Spiral Matrix 解题报告
- [leetcode] 59. Spiral Matrix II 解题报告
- [leetcode] 73. Set Matrix Zeroes 解题报告
- [LeetCode] Set Matrix Zeroes 解题报告
- [leetcode] 311. Sparse Matrix Multiplication 解题报告
- 【LeetCode】54. Spiral Matrix 解题报告
- 【LeetCode】59. Spiral Matrix II 解题报告
- Leetcode解题报告:73. Set Matrix Zeroes
- [Leetcode] 54. Spiral Matrix 解题报告
- [Leetcode] 59. Spiral Matrix II 解题报告
- [Leetcode] 73. Set Matrix Zeroes 解题报告
- 微信小程序访问php后台可以触发xdebug
- 商品切换(zhoukao03)
- 【学习cmake】CMake的CMakeLists.txt剖析-2
- 注册信息
- NGUI与UGUI
- [Leetcode] 542. 01 Matrix 解题报告
- C# 获取当前的 dll 所在的路径
- Struts2国际化
- git相关
- JAVA字符串格式化-String.format()的使用
- RESTful架构
- 九周三次课(12月20日) 17.3/17.4 celery多实例 17.5 celery与定时任务
- 购物车bean
- Android Studio生成签名文件步骤