美文网首页
994.腐烂的橘子

994.腐烂的橘子

作者: 最尾一名 | 来源:发表于2020-03-04 11:00 被阅读0次

    原题

    https://leetcode-cn.com/problems/rotting-oranges/

    解题思路

    典型的深度优先搜索。

    我们先遍历一遍,将所有腐烂的橘子的位置放入队列 {x: 腐烂橘子的横坐标, y: 腐烂橘子的纵坐标, min: 该橘子腐烂需要的时间},并给新鲜的橘子计数。

    当队列中有元素时,取出队列中的第一个元素 current,检查 current 的上下左右四个位置是否有新鲜的橘子,如果有的话:
    将新鲜橘子的位置入队 {x: 腐烂橘子的横坐标, y: 腐烂橘子的纵坐标, min: current + 1},并且更新当前的最大时间。

    当队列中没有元素时,检查 cnt 是否为 0,若不为零则返回 -1, 否则返回当前的最大时间。

    代码

    /**
     * @param {number[][]} grid
     * @return {number}
     */
    var orangesRotting = function(grid) {
        const m = grid.length, n = grid[0].length;
        const queue = new Array(), offset = [{x: -1, y: 0}, {x: 1, y: 0}, {x: 0, y: -1}, {x: 0, y: 1}];
        let cnt = 0, res = 0;
        for (let i = 0; i < m; ++i) {
            for (let j = 0; j < n; ++j) {
                if (grid[i][j] === 1) {
                    ++cnt;
                    continue;
                }
                if (grid[i][j] === 2) {
                    queue.push({x: i, y: j, min: 0});
                }
            }
        }
        while(queue.length) {
            const current = queue.shift();
            for (let i = 0; i < 4; ++i) {
                if ((offset[i].x+current.x >= 0) 
                && (offset[i].y+current.y >= 0) 
                && (offset[i].x+current.x < m) 
                && (offset[i].y+current.y < n) 
                && grid[offset[i].x+current.x][offset[i].y+current.y] === 1) {
                    grid[offset[i].x+current.x][offset[i].y+current.y] = 2;
                    --cnt;
                    queue.push({x: offset[i].x+current.x, y: offset[i].y+current.y, min: current.min + 1});
                    res = Math.max(res, current.min + 1);
                }
            }
        }
        return cnt ? -1 : res;
    };
    

    复杂度

    • 时间复杂度 O(MN)
    • 空间复杂度 O(MN)

    相关文章

      网友评论

          本文标题:994.腐烂的橘子

          本文链接:https://www.haomeiwen.com/subject/qvfmlhtx.html