腐烂的橘子

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

值 0 代表空单元格;

值 1 代表新鲜橘子;

值 2 代表腐烂的橘子。

每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。

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

class Solution {

// dr,dc 配合使用得到 grid[r][c] 上grid[r-1][c]左grid[r][c-1]下grid[r+1][c]右grid[r][c+1]的元素

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

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

public int orangesRotting(int[][] grid) {

// 获取二维数组的行数row 和 列数 column

int R = grid.length, C = grid[0].length;

// queue : all starting cells with rotten oranges

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); //存储橘子变为腐烂时的时间,key为橘子的一维数组下标,value为变腐烂的时间

}

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);

// 计次的关键 元素 grid[r][c] 的上左下右元素得腐烂时间应该一致

depth.put(ncode, depth.get(code) + 1);

ans = depth.get(ncode);

}

}

}

//检查grid,此时的grid能被感染已经都腐烂了,此时还新鲜的橘子无法被感染

for (int[] row: grid)

for (int v: row)

if (v == 1)

return -1;

return ans;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值