力扣hot图论部分

目录

题目链接

岛屿数量思路及其代码

代码如下

腐烂的橘子思路及其代码

注意事项

代码

课程表的思路及其代码

注意事项

代码

前缀树的思路及其代码

思路

代码


题目链接

200. 岛屿数量 - 力扣(LeetCode)

994. 腐烂的橘子 - 力扣(LeetCode)

207. 课程表 - 力扣(LeetCode)

208. 实现 Trie (前缀树) - 力扣(LeetCode)

其中简单分个类 岛屿数量是FloodFill(洪水灌溉算法)专题

腐烂的橘子是多源BFS专题

课程表是拓扑排序专题

前缀树是一种数据结构

岛屿数量思路及其代码

其实思路都是大同小异的。不过我提一提我的细节处理部分。

排除已经遍历过的岛屿的方法

引入向量数组去处理4个方向

代码如下

java 复制代码
class Solution {
    int[] dx={0,0,1,-1};
    int[] dy={1,-1,0,0};
    int size=0;
    boolean[][] visit;
    public int numIslands(char[][] grid) {
        Queue<int[]> queue=new LinkedList<>();
        int m=grid.length;
        int n=grid[0].length;
        visit=new boolean[m][n];
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
            if(grid[i][j]=='1'&&visit[i][j]==false){
                queue.offer(new int[]{i,j});  
                // grid[i][j]='0';
                visit[i][j]=true;
            
            while(!queue.isEmpty()){
                int[] t=queue.poll();
                int a=t[0];
                int b=t[1];
                for(int h=0;h<4;h++){
                    int x=a+dx[h];
                    int y=b+dy[h];
                    // if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]=='1'){
                        if(x>=0&&x<m&&y>=0&&y<n&&visit[x][y]==false&&grid[x][y]=='1'){
                        queue.offer(new int[]{x,y});
                        //将已经遍历过的修改为0
                        // grid[x][y]='0';
                        visit[x][y]=true;
                    }
                }
            }
            size++;
            }    
            }
        }
        return size;
        
    }
}

腐烂的橘子思路及其代码

思路还是同岛屿数量,代码都长得差不多.

注意事项

怎么判断是否还有新鲜橘子呢

注意一个烂橘子同时腐烂周围的橘子算1次,如果有两个烂橘子分别同时腐烂周围的橘子也算一次

所以说引入queue.size()和is_Infected就很重要。

代码

java 复制代码
class Solution {
    int fresh=0;
    boolean[][] visit;
    int[] dx={0,0,1,-1};
    int[] dy={1,-1,0,0};
    boolean isInfected=false;
    int minute=0;
    public int orangesRotting(int[][] grid) {
        int m=grid.length;
        int n=grid[0].length;
        visit=new boolean[m][n];
        //先统计所有新鲜的橘子数
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==1){
                    fresh++;
                }
                // fresh++;
            }
        }
        if(fresh==0){
            return 0;
        }
        Queue<int[]> queue=new LinkedList<>();
        //先找到所有腐烂的橘子,然后加入queue种
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(grid[i][j]==2){
                    queue.offer(new int[]{i,j});
                    visit[i][j]=true;
                }
            }
        }
        while(!queue.isEmpty()){
            //因为可能一次有多个腐烂橘子加入队列 同时是腐烂周围的橘子,本质上都是算一分钟
            int size=queue.size();
            for(int i=0;i<size;i++){
                int[] t=queue.poll();
                int a=t[0];
                int b=t[1];
                for(int h=0;h<4;h++){
                    int x=a+dx[h];
                    int y=b+dy[h];
                    if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1&&visit[x][y]==false){
                        queue.offer(new int[]{x,y});
                        visit[x][y]=true;
                        fresh--;
                        isInfected=true;
                    }
                }


            }
            if(isInfected){
                minute++;
                //记得还原
                isInfected=false;

            }

        
        }
        return fresh>0?-1:minute;

        
    }
}

课程表的思路及其代码

首先解决这道题,你需要直到什么是拓扑排序。

本质就是判断图是否有环即可

注意事项

怎么去建图,我认为很关键

代码

java 复制代码
class Solution {
    public boolean canFinish(int numCourses, int[][] prerequisites) {
        int m=prerequisites.length;
        // int n=prerequisites[0].length;
        //统计入度
        int[] in=new int[numCourses];
        //建图
        Map<Integer,List<Integer>> map=new HashMap<>();
        for(int i=0;i<m;i++){
            int a=prerequisites[i][0];
            int b=prerequisites[i][1]; //关系是b->a
            if(!map.containsKey(b)){
                map.put(b,new ArrayList<>());
            }
            map.get(b).add(a);
            in[a]++;
        }
        //进行拓扑排序 
        //进行BFS(找到所有入度为0的放入队列)
        Queue<Integer> queue=new LinkedList<>();
        for(int i=0;i<numCourses;i++){
            if(in[i]==0){
                queue.offer(i);
            }
        }
        while(!queue.isEmpty()){
            int t=queue.poll();
            //删除与入度为0的点相连的边
            for(int x:map.getOrDefault(t,new ArrayList<>())){
                in[x]--;
                if(in[x]==0){
                    queue.offer(x);
                }
            }
        }
        for(int p:in){
            if(p!=0){
                return false;
            }
        }
        return true;


        
    }
}

前缀树的思路及其代码

这道题我第一次写的时候,有点浮躁,看题解没看懂。今天在一次写的时候,突然看懂了.

主要是看的灵神的题解

思路

insert的具体插入图(插入apple)

代码

java 复制代码
class Trie {
    public static class Node{
        Node[] son=new Node[26];
        boolean end=false;
    }
    public Node root=new Node();
    
    public void insert(String word) {
        Node cur=root;
        for(char c:word.toCharArray()){
            int m=c-'a';
            if(cur.son[m]==null){
                cur.son[m]=new Node();
            }
            cur=cur.son[m];
        }
        cur.end=true;    
    }
    
    public boolean search(String word) {
        return find(word)==2;
        
    }
    
    public boolean startsWith(String prefix) {
        return find(prefix)!=0;
        
    }
    public int find(String word){
        Node cur=root;
        for(char c:word.toCharArray()){
            int m=c-'a';
            if(cur.son[m]==null){
                return 0;
            }
            cur=cur.son[m];
        }
        //返回2为完全匹配   返回1为前缀匹配
        return cur.end?2:1;
    }
}

/**
 * Your Trie object will be instantiated and called as such:
 * Trie obj = new Trie();
 * obj.insert(word);
 * boolean param_2 = obj.search(word);
 * boolean param_3 = obj.startsWith(prefix);
 */
相关推荐
LYFlied2 小时前
【每日算法】LeetCode 78. 子集
数据结构·算法·leetcode·面试·职场和发展
月明长歌2 小时前
【码道初阶】【Leetcode606】二叉树转字符串:前序遍历 + 括号精简规则,一次递归搞定
java·数据结构·算法·leetcode·二叉树
子枫秋月2 小时前
C++字符串操作与迭代器解析
数据结构·算法
鹿角片ljp2 小时前
力扣234.回文链表-反转后半链表
算法·leetcode·链表
(●—●)橘子……2 小时前
记力扣1471.数组中的k个最强值 练习理解
数据结构·python·学习·算法·leetcode
oioihoii2 小时前
C++共享内存小白入门指南
java·c++·算法
Bruce_kaizy2 小时前
c++图论————图的基本与遍历
c++·算法·图论
l1t2 小时前
利用小米mimo为精确覆盖矩形问题C程序添加打乱函数求出更大的解
c语言·开发语言·javascript·人工智能·算法
亭上秋和景清2 小时前
strlen;strcpy ;strcat
算法