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

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

岛屿数量


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


相关文章
|
7月前
|
测试技术
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
【动态规划】【组合数学】1866. 恰有 K 根木棍可以看到的排列数目
|
6月前
|
算法 C++
【洛谷 P1090】[NOIP2004 提高组] 合并果子(贪心算法+哈夫曼编码+优先队列)
该编程题目要求设计算法,将不同种类的果子合并成一堆,使得消耗的体力最小。给定果子种类数`n`(1至10000)和每种果子的数量,需输出合并的最小体力值。使用优先队列(最小堆),每次取出两个数量最少的果子堆合并,并更新总体力消耗。样例输入为3种果子(1, 2, 9),输出最小体力耗费为15。提供的AC代码采用C++实现,通过优先队列优化合并顺序。
88 0
|
7月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
44 1
|
7月前
|
人工智能
合并果子(哈夫曼树)NOIP2004提高组
合并果子(哈夫曼树)NOIP2004提高组
|
7月前
|
JavaScript
线性dp之石子合并
线性dp之石子合并
|
人工智能 算法 C++
洛谷 P1090 合并果子(贪心)
洛谷 P1090 合并果子(贪心)
143 0
|
7月前
|
人工智能
牛客xiao白月赛39 D(线段树维护区间)
牛客xiao白月赛39 D(线段树维护区间)
38 0
|
7月前
|
算法 搜索推荐 Java
算法编程(四):合并两个有序数组
算法编程(四):合并两个有序数组
77 0
|
人工智能
石子合并-区间dp
石子合并-区间dp
83 0
每日一题——合并两个有序链表
每日一题——合并两个有序链表