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

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

岛屿数量


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


相关文章
|
算法 机器人 C语言
【二分查找】分巧克力、机器人跳跃、数的范围
开始准备蓝桥杯啦!这是计划的一部分,每天都会更新一个专题的内容,内容参考自acwing蓝桥杯辅导课,有兴趣的uu们也可以自行观看
107 0
|
算法 测试技术 Android开发
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
72 2
LeetCode 周赛上分之旅 #45 精妙的 O(lgn) 扫描算法与树上 DP 问题
|
3月前
【刷题记录】尼科彻斯定理、数对、环形结构
【刷题记录】尼科彻斯定理、数对、环形结构
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
5月前
|
存储 人工智能 测试技术
每日练习之排序——链表的合并;完全背包—— 兑换零钱
每日练习之排序——链表的合并;完全背包—— 兑换零钱
30 2
|
6月前
|
Serverless
每日一题(统计每个月兔子的总数,数列的和)
每日一题(统计每个月兔子的总数,数列的和)
38 0
|
6月前
|
C++ 索引 Python
leetcode-200:岛屿数量
leetcode-200:岛屿数量
44 0
|
6月前
leetcode-1189:“气球” 的最大数量
leetcode-1189:“气球” 的最大数量
30 0
|
6月前
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
44 0
|
算法
【算法挨揍日记】day12——153. 寻找旋转排序数组中的最小值、LCR 173. 点名
已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
112 1