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

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

岛屿数量


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


相关文章
|
3月前
|
存储
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
33 0
|
2月前
|
存储 算法 测试技术
力扣经典150题第四十八题:合并区间
力扣经典150题第四十八题:合并区间
14 0
|
2月前
|
算法 C++
【洛谷 P1090】[NOIP2004 提高组] 合并果子(贪心算法+哈夫曼编码+优先队列)
该编程题目要求设计算法,将不同种类的果子合并成一堆,使得消耗的体力最小。给定果子种类数`n`(1至10000)和每种果子的数量,需输出合并的最小体力值。使用优先队列(最小堆),每次取出两个数量最少的果子堆合并,并更新总体力消耗。样例输入为3种果子(1, 2, 9),输出最小体力耗费为15。提供的AC代码采用C++实现,通过优先队列优化合并顺序。
28 0
|
3月前
|
人工智能
合并果子(哈夫曼树)NOIP2004提高组
合并果子(哈夫曼树)NOIP2004提高组
|
3月前
|
算法 测试技术 C#
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
【图论】【分类讨论】LeetCode3017按距离统计房屋对数目
|
3月前
leetcode-1706:球会落何处
leetcode-1706:球会落何处
30 0
|
3月前
|
C++ 索引 Python
leetcode-200:岛屿数量
leetcode-200:岛屿数量
36 0
|
9月前
|
人工智能 算法
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
代码随想录算法训练营第三十五天 | LeetCode 435. 无重叠区间、763. 划分字母区间、56. 合并区间
52 0
图解LeetCode——200. 岛屿数量
图解LeetCode——200. 岛屿数量
11472 1
图解LeetCode——200. 岛屿数量