问题: https://leetcode.com/problems/01-matrix/#/description

基本思路:广度优先遍历,根据所有最短距离为N的格找到所有距离为N+1的格,直到所有的格都找到了最短距离。

具体步骤:

首先初始化矩阵,值为0的格其最短距离也是0,保持不变;值为1的格是后面需要计算最短距离的格,我们需要一个整数来标识它们,这里可以选择一个负数或者整数的最大值。

然后进行若干轮计算,第N轮会根据已经计算出的最短距离为N-1的所有格,来找出所有最短距离为N的格。

例如,第1轮计算就是根据所有最短距离为0的格,找到所有距离为1的格。

第5轮计算,就是根据所有最短距离为4的格,找到所有距离为5的格。

具体怎么找呢?对每一个最短距离为N-1的格,跟它相邻的上下左右四个方向的格,其中还没有计算出最短距离的格(即值为负数或者整数的最大值的)的最短距离一定是N。

如果不是N而是小于N的某个数M的话,那么这个格在前面的M-1轮就应该找到了,跟第M-1轮找到所有的最短距离为M的格矛盾。

用Java 8实现如下:

 public class Solution {
public int[][] updateMatrix(int[][] matrix) {
Queue<int[]> queue = new LinkedList<>();
// 初始化矩阵
for(int i = 0; i < matrix.length; i++) {
for(int j = 0; j < matrix[0].length; j++) {
if(matrix[i][j] == 0) {
queue.offer(new int[]{i, j});
}else {
matrix[i][j] = Integer.MAX_VALUE;
}
}
} int[][] dirs = new int[][]{{0, -1},{-1, 0},{0, 1},{1, 0}};
while(!queue.isEmpty()) {
int[] cell = queue.poll();
for(int i = 0; i < dirs.length; i++) {
int r = cell[0] + dirs[i][0];
int c = cell[1] + dirs[i][1];
if(r >= 0 && r < matrix.length && c >= 0 && c < matrix[0].length && matrix[cell[0]][cell[1]] + 1 < matrix[r][c]) {
matrix[r][c] = matrix[cell[0]][cell[1]] + 1;
queue.offer(new int[]{r, c});
}
}
} return matrix;
}
}

[Leetcode] 01 Matrix的更多相关文章

  1. [LeetCode] 01 Matrix 零一矩阵

    Given a matrix consists of 0 and 1, find the distance of the nearest 0 for each cell. The distance b ...

  2. [LeetCode] 01 Matrix 题解

    题意 # 思路 我一开始的时候想的是嘴 # 实现 ```cpp // // include "../PreLoad.h" class Solution { public: /** ...

  3. [Leetcode Week10]01 Matrix

    01 Matrix 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/01-matrix/description/ Description Given a ...

  4. 【LeetCode】01 Matrix 解题报告

    [LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...

  5. [leetcode] 542. 01 Matrix (Medium)

    给予一个矩阵,矩阵有1有0,计算每一个1到0需要走几步,只能走上下左右. 解法一: 利用dp,从左上角遍历一遍,再从右下角遍历一遍,dp存储当前位置到0的最短距离. 十分粗心的搞错了col和row,改 ...

  6. leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings

    542. 01 Matrix https://www.cnblogs.com/grandyang/p/6602288.html 将所有的1置为INT_MAX,然后用所有的0去更新原本位置为1的值. 最 ...

  7. LeetCode: Spiral Matrix II 解题报告-三种方法解决旋转矩阵问题

    Spiral Matrix IIGiven an integer n, generate a square matrix filled with elements from 1 to n2 in sp ...

  8. 计算机学院大学生程序设计竞赛(2015’12)01 Matrix

    01 Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. hdu 01 Matrix

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission ...

随机推荐

  1. DVWA 黑客攻防演练(十二) DOM型 XSS 攻击 DOM Based Cross Site Scripting

    反射型攻击那篇提及到,如何是"数据是否保存在服务器端"来区分,DOM 型 XSS 攻击应该算是 反射型XSS 攻击. DOM 型攻击的特殊之处在于它是利用 JS 的 documen ...

  2. rocketmq4.x快速入门指南

    以下采用的是apache rocketmq 4.2.0版本 相关文档如下 快速体验: http://blog.seoui.com/2018/07/24/rocketmqinstall/ rocketm ...

  3. Linux(CentOS 7)安装测试mysql5.6服务

    1.rpm -qa | grep mysql,查看原系统中是否有已经安装得mysql. 注:centos7系统在安装完成后,未安装mysql任何版本. 2. rpm -e --nodeps mysql ...

  4. SimpleDateFormat日期格式化总结

    1.new一个java.util.Date对象,调用它的setYear.setMonth等等方法,设置你要的年月日.不过这种做法不推荐,因为setYear等方法已经过时了.2.new一个java.ut ...

  5. SQL insert into select 语句

    遇到权限数据变更的需要批量到别的平台, 在175平台添加一个权限需要, 批量到别的现有平台, 以后的建站, 会把sql放到自动建站里面; 权限的 insert into select 表一: `ous ...

  6. SQL 游标的使用

    适用场景:对查询出的结果集遍历,作用类似于其他语言的列表循环语句. 相关语法: --定义游标 DECLARE cr CURSOR FOR( SELECT Cust_ID ,Cust_Name ,IDC ...

  7. 实战 EF(LINQ) 如何以子查询的形式来 Join

    如题,大多数网上关于 LINQ Join 的示例都是以 from x in TableA  join ... 这样的形式,这种有好处,也有劣势,就是在比如我们使用的框架如果已经封装了很多方法,比如分页 ...

  8. PHP字符串函数、常量、数组排序

    PHP字符串函数.常量.数组排序 strlen() 说明:strlen(),可以统计字符串长度 用途:strlen() 常用于循环和其他函数,在确定字符串何时结束很重要时.(例如,在循环中,我们也许需 ...

  9. FreeHttp (a fiddler add in to temper the http)

    introduction FreeHttp is a Fiddler plugin. With FreeHttp you can modify the request or response mess ...

  10. 使用FreeCookies 控制浏览器cookies及修改http响应内容

    FreeCookies 插件安装 :您的计算机需要已经安装Fiddler (如未安装,请至官网下载安装 http://docs.telerik.com/fiddler/configure-fiddle ...