hot100-一刷-09图论(共4道题)

200. 岛屿数量

题目链接

题目描述

image

代码实现

分析:
dfs

代码:

class Solution {
    public int numIslands(char[][] grid) {
        int ans = 0;
        for (int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                if (grid[i][j] == '1'){
                    dfs(grid, i, j);
                    ans++;
                }
            }
        }
        return ans;
    }

    private void dfs(char[][] grid, int i, int j){
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] != '1'){
            return;
        }
        grid[i][j] = '2';
        dfs(grid, i, j -1);
        dfs(grid, i, j +1);
        dfs(grid, i-1 , j );
        dfs(grid, i +1, j);
    }
}

994. 腐烂的橘子

题目链接

题目描述

image

代码实现

分析:

  • BFS

代码:

class Solution {
    // 感染方向
    private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    public int orangesRotting(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int fresh = 0;
        List<int[]> q = new ArrayList<>();
        // 统计初始腐烂橘子和新鲜橘子
        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){
                if(grid[i][j] == 1){
                    fresh++;
                }else if(grid[i][j] == 2){
                    q.add(new int[]{i, j});
                }
            }
        }

        // BFS模拟腐烂过程
        int ans = 0;
        while(fresh > 0 && !q.isEmpty()){
            ans++;
            List<int[]> temp = q;
            q = new ArrayList<>();
            // 对该时刻的所有腐烂橘子进行BFS
            for(int[] pos : temp){
                // 查找四个方向
                for (int[] d : DIRECTIONS){
                    int i = pos[0] + d[0];
                    int j = pos[1] + d[1];
                    // 感染新鲜橘子
                    if(i >= 0 && i < m && j >=0 && j < n && grid[i][j] == 1){
                        fresh--;
                        // 添加到下一时刻需要遍历的队列中
                        q.add(new int[]{i, j});
                        // 标记为腐烂
                        grid[i][j] = 2; 
                    }
                }
            }
        }

        return fresh > 0 ? -1 : ans;
    }


}

207. 课程表

题目链接

题目描述

image

代码实现

分析:

代码:

class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        // 构建图g, 长度为课程数
        List<Integer>[] g = new ArrayList[numCourses];
        Arrays.setAll(g, i -> new ArrayList<>());
        for (int[] p : prerequisites){
            // 初始化连接
            g[p[1]].add(p[0]);
        }

        int[] colors = new int[numCourses];
        // 对每个入口dfs找环
        for (int i = 0; i < numCourses; i++){
            if (colors[i] == 0 && dfs(i, g, colors)){
                return false; //有环
            }
        }
        return true;
    }

    private boolean dfs(int x, List<Integer>[] g, int[] colors){
        colors[x] = 1; // x正在访问中
        for (int y : g[x]){
            if(colors[y] == 1 || colors[y] == 0 && dfs(y, g, colors)){
                return true; // 找到环
            }
        }
        colors[x] = 2;  // x这个入口完全dfs完了,没找到环
        return false;
    }
}

208. 实现 Trie (前缀树)

题目链接

题目描述

image

代码实现

分析:

代码:

class Node {
    Node[] son = new Node[26];
    boolean end;
}

class Trie {
    private Node root;

    public Trie() {
        root = new Node();
    }
    
    public void insert(String word) {
        Node cur = root;
        for (char c : word.toCharArray()){
            c -= 'a';
            if(cur.son[c] == null){
                cur.son[c] = new Node();
            }
            cur = cur.son[c];
        }
        cur.end = true;
    }
    
    public boolean search(String word) {
        return find(word)==1;
    }
    
    public boolean startsWith(String prefix) {
        return find(prefix) != 0;
    }

    private int find(String word){
        Node cur = root;
        for(char c : word.toCharArray()){
            c -= 'a';
            if(cur.son[c] == null){
                // 没有找到
                return 0;
            }
            cur = cur.son[c];
        }
        return cur.end ? 1 : 2;
    }
}

posted @ 2024-12-17 13:47  chendsome  阅读(3)  评论(0编辑  收藏  举报