每日三题-岛屿数量、合并二叉树、课程表

简介: 每日三题岛屿数量合并二叉树课程表

岛屿数量


1d538e5ed09340dcb273f89cb8606763.png

解法一

class Solution {
    public int numIslands(char[][] grid) {
        int res = 0;
        for(int i = 0;i < grid.length;i++){
            for(int j = 0;j < grid[0].length;j++){
                if(grid[i][j] == '1'){
                    res++;
                    dfs(grid,i,j);
                }
            }
        }
        return res;
    }
    public void dfs(char[][] grid,int i,int j){
        if(i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0') return;
        int[][] dirs = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
        grid[i][j] = '0';
        for(int[] dir : dirs){
            dfs(grid,i+dir[0],j+dir[1]);
        }
    }
}


合并二叉树


ccadeb6ec81b4cae819cad2df22fd508.png

解法一

递归

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        if(root1 == null) return root2;
        if(root2 == null) return root1;
        root1.val = root1.val+root2.val;
        root1.left= mergeTrees(root1.left,root2.left);
        root1.right = mergeTrees(root1.right,root2.right);
        return root1;
    }
}


课程表


e08259915d6c400e85cd1780c0240bd2 (1).png


解法一

BFS

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 [] prerequisite:prerequisites){
            edges.get(prerequisite[1]).add(prerequisite[0]);
            indeg[prerequisite[0]]++;
        }
        Queue<Integer> q = new LinkedList<>();
        for(int i = 0;i < numCourses;i++){
            if(indeg[i] == 0) q.add(i);
        }
        int visited = 0;
        while(!q.isEmpty()){
            visited++;
            int t = q.poll();
            for(int e:edges.get(t)){
                indeg[e]--;
                if(indeg[e] == 0){
                    q.add(e);
                }
            }
        }
        return visited == numCourses;
    }
}

解法二

DFS

class Solution {
    List<List<Integer>> edges;  // 保存的是边
    int visited[];
    boolean valid = true;
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        edges = new ArrayList<List<Integer>>();
        for(int i = 0;i < numCourses;i++){
            edges.add(new ArrayList<Integer>());
        } 
        visited = new int[numCourses];
        for(int [] prerequisite:prerequisites){
            edges.get(prerequisite[1]).add(prerequisite[0]);
        }
        for(int i = 0;i < numCourses  && valid;i++){
            if(visited[i] == 0){
                dfs(i);
            }
        }
        return valid;
    }
    public void dfs(int u){
        visited[u] = 1;
        for(int t:edges.get(u)){
            if(visited[t] == 0){
                dfs(t);
                if(!valid){
                    return;
                }
            }else if(visited[t] == 1){
                valid = false;
                return;
            }
        }
        visited[u] = 2;
    }
}


相关文章
|
9月前
|
存储
【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针
【每日一题Day132】LC23633合并相似的物品 | 哈希表 排序+双指针
64 0
|
8月前
|
存储 算法
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
算法训练,牛客.判断是不是平衡二叉树 牛客.最大子矩阵两个数组的交集牛客.数组中两个字符串的最小距离
|
9月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
58 1
|
9月前
|
编译器 数据安全/隐私保护
PTA 线性表 7-1 约瑟夫环(Josephus)问题(by Yan) (100分) 按出列次序输出每个人的编号
PTA 线性表 7-1 约瑟夫环(Josephus)问题(by Yan) (100分) 按出列次序输出每个人的编号
|
9月前
|
JavaScript
线性dp之石子合并
线性dp之石子合并
|
9月前
|
人工智能
合并果子(哈夫曼树)NOIP2004提高组
合并果子(哈夫曼树)NOIP2004提高组
|
9月前
【每日一题Day303】统计点对的数目 | 哈希表+双指针
【每日一题Day303】统计点对的数目 | 哈希表+双指针
55 0
每日一题——合并两个有序链表
每日一题——合并两个有序链表