zoukankan      html  css  js  c++  java
  • 286 walls and gate最近的出口

    [抄题]:

    您将获得一个使用这三个可能值初始化的 m×n 2D 网格。
    -1 - 墙壁或障碍物。 
    0 - 门。 
    INF - Infinity是一个空房间。我们使用值 2 ^ 31 - 1 = 2147483647 来表示INF,您可以假设到门的距离小于 2147483647
    在代表每个空房间的网格中填入到距离最近门的距离。如果不可能到达门口,则应填入 INF

    给定 2D 网格:

    INF  -1  0  INF
    INF INF INF  -1
    INF  -1 INF  -1
      0  -1 INF INF
    

    返回结果:

      3  -1   0   1
      2   2   1  -1
      1  -1   2  -1
      0  -1   3   4

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    1. 不知道“距离”应该对应什么数学表达式:没有抓住题目的特点,求“最短的”距离,就可以联想到最短路问题
    2. 在最短路问题中,以前没见过:把看似复杂的多原点-单终点 反向转化为 单原点- 多终点 增加超级源之后,多原点-多终点也能最终转换成单原点-多终点

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    [一刷]:

    1. 新被淹没了的x y坐标记得放到队列中

    [二刷]:

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    1. 新被淹没了的x y坐标记得放到队列中

    [复杂度]:Time complexity: O(m*n) 每个点都被淹没了Space complexity: O(m+n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    棋盘图:用图上的BFS

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

     [代码风格] :

    public class Solution {
        /*
         * @param rooms: m x n 2D grid
         * @return: nothing
         */
         //declare
         int n, m;
         static final int INF = 2147483647;
        public void wallsAndGates(int[][] rooms) {
            n = rooms.length;
            if (n == 0) {
                return ;
            }
            m = rooms[0].length;
            
            Queue<Integer> qx = new LinkedList<>();
            Queue<Integer> qy = new LinkedList<>();
            
            int[] dx = {0, 1, 0, -1};
            int[] dy = {1, 0, -1, 0};
            
            //get all 0 into queue
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < m; j++) {
                    if (rooms[i][j] == 0) {
                        qx.offer(i);
                        qy.offer(j);
                    }
                }
            }
            
            while (!qx.isEmpty()) {
                int cx = qx.poll();
                int cy = qy.poll();
                
                for (int i = 0; i < 4; i++) {
                    int nx = cx + dx[i];
                    int ny = cy + dy[i];
                    if (0 <= nx && nx < n && 0 <= ny && ny < m &&
                    rooms[nx][ny] == INF) {
                        qx.offer(nx);
                        qy.offer(ny);
                        rooms[nx][ny] = rooms[cx][cy] + 1;//watered so shoud be put
                    }
                }
            }
        }
    }
    View Code
  • 相关阅读:
    20180929 北京大学 人工智能实践:Tensorflow笔记02
    20180929 北京大学 人工智能实践:Tensorflow笔记01
    YOLOv3学习笔记
    编辑器上传漏洞
    IIS解析漏洞利用
    数据库备份及审查元素进行webshell上传
    burp suite 进行webshell上传
    BUGKU CFT初学之WEB
    CTFbugku--菜鸟初学
    理解PHP中的会话控制
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8454780.html
Copyright © 2011-2022 走看看