01 矩阵(力扣)多源广度优先搜索 JAVA

这篇具有很好参考价值的文章主要介绍了01 矩阵(力扣)多源广度优先搜索 JAVA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给定一个由 0 和 1 组成的矩阵 mat ,请输出一个大小相同的矩阵,其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。

两个相邻元素间的距离为 1 。

01 矩阵(力扣)多源广度优先搜索 JAVA,矩阵,leetcode,宽度优先

输入:mat = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0,0],[0,1,0],[0,0,0]]

01 矩阵(力扣)多源广度优先搜索 JAVA,矩阵,leetcode,宽度优先

输入:mat = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0,0],[0,1,0],[1,2,1]]

提示:

m == mat.length
n == mat[i].length
1 <= m, n <= 10^4
1 <= m * n <= 10^4
mat[i][j] is either 0 or 1.
mat 中至少有一个 0

解题思路:

1、相邻指的是上下左右四方向

2、与其以1为起点,不如以所有0为起点,这是个不错的逆向思维

3、所有0初始值为0,所有1初始值Integer.MAX_VALUE/2

4、前者值 + 1比后者值小即可更新后者值

代码:

class Solution {
  	public int fx[] = {-1, 1, 0, 0};
	public int fy[] = {0, 0, -1, 1};//上下左右
  	public int INF = Integer.MAX_VALUE / 2;
    public int[][] updateMatrix(int[][] mat) {
        int m = mat.length;
        int n = mat[0].length;
        Queue<int[]> qu = new LinkedList<>();
        for(int i = 0; i < m; i ++)
        	for(int j = 0; j < n; j ++)
        		if(mat[i][j] == 0) {
        			 qu.add(new int[] {i, j});
        		}
        		else mat[i][j] = INF;
        bfs(qu, mat, m, n);
        return mat;
    }
    public void bfs(Queue<int[]> qu, int[][] mat, int m, int n) {
    	while(!qu.isEmpty()) {
    		int xy[] = qu.poll();
    		for(int i = 0;i < 4; i ++) {
    			int fxx = xy[0] + fx[i];
    			int fyy = xy[1] + fy[i];
    			if(fxx >= 0 && fxx < m && fyy >= 0 && fyy < n && mat[xy[0]][xy[1]] + 1 < mat[fxx][fyy]) {
    				mat[fxx][fyy] = mat[xy[0]][xy[1]] + 1;
    				qu.add(new int[]{fxx, fyy});
    			}
    				 
    		}
    	}
    }
}

01 矩阵(力扣)多源广度优先搜索 JAVA,矩阵,leetcode,宽度优先文章来源地址https://www.toymoban.com/news/detail-616171.html

到了这里,关于01 矩阵(力扣)多源广度优先搜索 JAVA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包