LeetCode刷题笔记 994. 腐烂的橘子

题目描述

在给定的网格中,每个单元格可以有以下三个值之一:

值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。

每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。

返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。

示例1:
在这里插入图片描述
输入:[[2,1,1],[1,1,0],[0,1,1]]
输出:4

示例2:
输入:[[2],[1],[1],[1],[2],[1],[1]]
输出:2

Sample Code 1

…||grid[i-1][j]-grid[i][j]>1)是为了缩减天数,避免像示例2那样正面循环过来后天数不合理过高的情况

class Solution {
    int[][] grid;
    int row;
    int column;
    public int orangesRotting(int[][] grid) {
        this.grid=grid;
        this.row=grid.length;
        this.column=grid[0].length;

        for(int i=0;i<row;i++)
            for(int j=0;j<column;j++)
                if(grid[i][j]==2)
                    bfs(i,j,2);
        
        int res=0;
        for(int i=0;i<row;i++){
            for(int j=0;j<column;j++){
                if(grid[i][j]==1) return -1;
                res=Math.max(res,grid[i][j]);
            }
        }
        
        if(res==0) return 0;
        return res-2;
    }
    public void bfs(int i,int j,int val){
        grid[i][j]=val;
        if(i>0&&(grid[i-1][j]==1||grid[i-1][j]-grid[i][j]>1))
            bfs(i-1,j,val+1);
        
        if(j>0&&(grid[i][j-1]==1||grid[i][j-1]-grid[i][j]>1))
            bfs(i,j-1,val+1);
        
        if(i<row-1&&(grid[i+1][j]==1||grid[i+1][j]-grid[i][j]>1))
            bfs(i+1,j,val+1);
        
        if(j<column-1&&(grid[i][j+1]==1||grid[i][j+1]-grid[i][j]>1))
            bfs(i,j+1,val+1);
    }
}

Sample Code 2

class Solution {
    int[] dr = new int[]{-1, 0, 1, 0};
    int[] dc = new int[]{0, -1, 0, 1};

    public int orangesRotting(int[][] grid) {
        int R = grid.length, C = grid[0].length;

        Queue<Integer> queue = new ArrayDeque();
        Map<Integer, Integer> depth = new HashMap();
        for (int r = 0; r < R; ++r)
            for (int c = 0; c < C; ++c)
                if (grid[r][c] == 2) {
                    int code = r * C + c;
                    queue.add(code);
                    depth.put(code, 0);
                }

        int ans = 0;
        while (!queue.isEmpty()) {
            int code = queue.remove();
            int r = code / C, c = code % C;
            for (int k = 0; k < 4; ++k) {
                int nr = r + dr[k];
                int nc = c + dc[k];
                if (0 <= nr && nr < R && 0 <= nc && nc < C && grid[nr][nc] == 1) {
                    grid[nr][nc] = 2;
                    int ncode = nr * C + nc;
                    queue.add(ncode);
                    depth.put(ncode, depth.get(code) + 1);
                    ans = depth.get(ncode);
                }
            }
        }

        for (int[] row: grid)
            for (int v: row)
                if (v == 1)
                    return -1;
        return ans;

    }
}

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotting-oranges

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值