• 542. 01 Matrix


    Medium

    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,0],
     [0,1,0],
     [0,0,0]]
    
    Output:
    [[0,0,0],
     [0,1,0],
     [0,0,0]]
    

    Example 2:

    Input:
    [[0,0,0],
     [0,1,0],
     [1,1,1]]
    
    Output:
    [[0,0,0],
     [0,1,0],
     [1,2,1]]
    

    Note:

    1. The number of elements of the given matrix will not exceed 10,000.
    2. There are at least one 0 in the given matrix.
    3. The cells are adjacent in only four directions: up, down, left and right.
    Accepted
    46,846
    Submissions
    129,726
     
     
    思路:
    1 如果格子内元素本身是0, 不需要计算, 自己到自己的距离为0
    2 如果格子内元素非0, 自然想到DP, 上下左右四个方向的元素,找出最小的, 再加1
    3 由于格子是二维矩阵, 然而代码遍历是一维遍历. 所以需要遍历两遍. 左上+右下 或者  右上+左下  都可以.  想象一下 要是三维矩阵... 估计得遍历四次了... 再follow up N维矩阵怎么办...
     
    class Solution {
        public int[][] updateMatrix(int[][] matrix) {
            if(null==matrix||matrix.length<1)return null;
            
            int width=matrix[0].length;
            int height=matrix.length;
            int [][]res=new int[height][width];
            for(int j=0;j<height;++j)
                for(int i=0;i<width;++i)
                    res[j][i]=Integer.MAX_VALUE-1;  //这里有个坑点,如果不-1, 得到完全错误的结果. 因为底下的dp会+1, 就溢出变成负数....; 要么这里选择稍小的数字
            
            for(int j=0;j<height;++j)
                for(int i=0;i<width;++i)
                {
                    if(0==matrix[j][i])
                        res[j][i]=0;
                    else
                    {
                        if(i>0)
                            res[j][i]=Math.min(res[j][i], res[j][i-1]+1);
                        if(j>0)
                            res[j][i]=Math.min(res[j][i], res[j-1][i]+1);
                    }
                }
            
            for(int j=height-1;j>=0;--j)
                for(int i=width-1;i>=0;--i)
                {
                    if(0==matrix[j][i])res[j][i]=0;
                    else
                    {
                        if(j<height-1)
                            res[j][i]=Math.min(res[j][i], res[j+1][i]+1);
                        if(i<width-1)
                            res[j][i]=Math.min(res[j][i], res[j][i+1]+1);
                    }
                }
            return res;
            
        }
    }
     
     
  • 相关阅读:
    好尚不可为,其况恶乎(转)
    getResource(String name)用法及源码分析
    怎样从ext3升级到ext4?
    Java设计模式之适配器模式(Adapter Pattern)
    javascript实现图片无缝滚动(scrollLeft的使用方法介绍)
    PowerDesigner使用教程
    python 多线程编程
    java中接口的定义与实现
    Java调用cmd命令 打开一个站点
    C#中MessageBox使用方法大全(附效果图)
  • 原文地址:https://www.cnblogs.com/lychnis/p/11179862.html
Copyright © 2020-2023  润新知