mybloger

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

51、腐烂的橘子

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

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

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

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

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<Integer>();
        Map<Integer,Integer> depth = new HashMap<Integer,Integer>();
        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;
}

52、课程表

你这个学期必须选修 numCourses 门课程,记为 0numCourses - 1

在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai必须 先学习课程 bi

  • 例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1

请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false

示例 1:

输入:numCourses = 2, prerequisites = [[1,0]]
输出:true
解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。

示例 2:

输入:numCourses = 2, prerequisites = [[1,0],[0,1]]
输出:false
解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
class Solution {

    List<List<Integer>> edges;
    int[] indeg;

    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges = new ArrayList<List<Integer>>();
        for (int i = 0;i < numCourses;++i) {
            edges.add(new ArrayList<Integer>());
        }
        indeg = new int[numCourses];
        for (int[] info : prerequisites) {
            edges.get(info[1]).add(info[0]);
            ++indeg[info[0]];
        }

        Queue<Integer> queue = new LinkedList<Integer>();
        for (int i = 0;i < numCourses;++i) {
            if (indeg[i] == 0) {
                queue.offer(i);
            }
        }

        int visited = 0;
        while (!queue.isEmpty()) {
            ++visited;
            int u = queue.poll();
            for (int v : edges.get(u)) {
                --indeg[v];
                if (indeg[v] == 0) {
                    queue.offer(v);
                }
            }
        }
        return visited == numCourses;
    }
}
posted on 2025-07-04 20:42  万能包哥  阅读(14)  评论(0)    收藏  举报