• 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;
            
        }
    }
     
     
  • 相关阅读:
    WM_MOUSEWHEEL消息的处理
    Delphi之TStrings和TStringLists类[转]
    使用mysqladmin命令修改Mysql密码
    AP_发票与预付款核销时预付款带税码
    ORACLE EBS AP发票到付款的数据流
    .关于货币大写的探索
    Oracle SQL 空值排序(Nulls)
    实现主从关系Form中汇总行金额/数量
    巧妙的查看FORM中的 LOV查询语句
    供应商接口的使用
  • 原文地址:https://www.cnblogs.com/lychnis/p/11179862.html
Copyright © 2020-2023  润新知