LeetCode之01 Matrix

本题的题意是给定一个元素个数不超过10000的01矩阵,而且其中至少有一个0,求该矩阵中所有元素距离其最近的0的距离。其中,每个元素与其上下左右的元素之间的距离为1。

我采用BFS的思想解决此题。首先将矩阵matrix中所有等于0的坐标加入到队列中,所有等于1的元素置为一个不可能达到的距离最大值(这里取100000),意为当前所有的0都是最短距离(距离是0),所有的1到0的距离是无穷大的。然后不断地从队列中移除首元素,并将首元素坐标的四周可以更新为更短距离的坐标更新为当前的最短距离,并将该坐标加入队列尾部,直到队列为空,最后返回更新完的matrix就可以了。

class Solution {
	public:
		vector<vector<int>> updateMatrix(vector<vector<int>>& matrix) {
			queue<pair<int, int>> bfs;

			for (int i = 0; i < matrix.size(); ++i) {
				for (int j = 0; j < matrix[i].size(); ++j) {
					if (matrix[i][j] == 0) {
						pair<int, int> cord_0(i, j);

						bfs.push(cord_0);
					} else {
						matrix[i][j] = 100000;
					}
				}
			}
			while (!bfs.empty()) {
				pair<int, int> curr_ = bfs.front();

				bfs.pop();

				if (curr_.first - 1 >= 0 && matrix[curr_.first - 1][curr_.second] > matrix[curr_.first][curr_.second] + 1) {
					matrix[curr_.first - 1][curr_.second] = matrix[curr_.first][curr_.second] + 1;

					pair<int, int> cord_(curr_.first - 1, curr_.second);

					bfs.push(cord_);
				}
				if (curr_.second - 1 >= 0 && matrix[curr_.first][curr_.second - 1] > matrix[curr_.first][curr_.second] + 1) {
					matrix[curr_.first][curr_.second - 1] = matrix[curr_.first][curr_.second] + 1;

					pair<int, int> cord_(curr_.first, curr_.second - 1);

					bfs.push(cord_);
				}
				if (curr_.second + 1 < matrix[0].size() && matrix[curr_.first][curr_.second + 1] > matrix[curr_.first][curr_.second] + 1) {
					matrix[curr_.first][curr_.second + 1] = matrix[curr_.first][curr_.second] + 1;

					pair<int, int> cord_(curr_.first, curr_.second + 1);

					bfs.push(cord_);
				}
				if (curr_.first + 1 < matrix.size() && matrix[curr_.first + 1][curr_.second] > matrix[curr_.first][curr_.second] + 1) {
					matrix[curr_.first + 1][curr_.second] = matrix[curr_.first][curr_.second] + 1;

					pair<int, int> cord_(curr_.first + 1, curr_.second);

					bfs.push(cord_);
				}
			}

			return matrix;
		}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值