力扣-图论-9【算法学习day.59】

前言

###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.新增道路查询后的最短距离I

题目链接: 3243. 新增道路查询后的最短距离 I - 力扣(LeetCode)

题面:

分析:bfs

贴上大佬代码:

java 复制代码
class Solution {
    public int[] shortestDistanceAfterQueries(int n, int[][] queries) {
        List<Integer>[] g = new ArrayList[n - 1]; // 邻接表
        Arrays.setAll(g, i -> new ArrayList<>()); // 初始化邻接表
        for (int i = 0; i < n - 1; i++) { // 构建初始图
            g[i].add(i + 1);
        }
        int[] ans = new int[queries.length]; // 结果数组
        int[] vis = new int[n - 1]; // 访问标记数组
        for (int i = 0; i < queries.length; i++) { // 处理每个查询
            g[queries[i][0]].add(queries[i][1]); // 添加边
            ans[i] = bfs(i + 1, g, vis, n); // 计算最短距离
        }
        return ans; // 返回结果
    }

    private int bfs(int i, List<Integer>[] g, int[] vis, int n) {
        Queue<Integer> q = new LinkedList<>(); // 队列
        q.offer(0); // 起点
        int step = 1; // 步数
        while (!q.isEmpty()) { // BFS
            int size = q.size();
            for (int j = 0; j < size; j++) {
                int x = q.poll();
                for (int y : g[x]) {
                    if (y == n - 1) { // 到达终点
                        return step;
                    }
                    if (vis[y] != i) { // 未访问
                        vis[y] = i;
                        q.offer(y);
                    }
                }
            }
            step++;
        }
        return -1; // 无法到达
    }
}

2.获取你好友已观看的视频

题目链接: 1311. 获取你好友已观看的视频 - 力扣(LeetCode)

大佬代码:

java 复制代码
class Solution {
    public List<String> watchedVideosByFriends(List<List<String>> watchedVideos, int[][] friends, int id, int level) {
        //bfs找到level好友
        Deque<Integer> q = new ArrayDeque<>();
        q.addLast(id);
        int size = q.size();
        //用于记录防止重复
        Set<Integer> set = new HashSet<>();
        set.add(id);
        while(level>0){
            int i = q.pollFirst();
            for(int a : friends[i]){
                if(!set.contains(a)){
                    set.add(a);
                    q.addLast(a);
                }
            }
            size--;
            if(size == 0){
                level--;
                size = q.size();
            }
        }
        //哈希表-记录level朋友观看的视频
        Map<String,Integer> map = new HashMap<>();
        while(!q.isEmpty()){
            int i = q.pollFirst();
            for(String s : watchedVideos.get(i)){
                if(map.containsKey(s))
                    map.put(s,map.get(s)+1);
                else map.put(s,1);
            }
        }
        List<String> list = new ArrayList<>(map.keySet());
        //排序
        list.sort((a,b)->{
            if(map.get(a) == map.get(b)){
                int i = 0;
                while(true){
                    if(a.charAt(i) != b.charAt(i))
                        return a.charAt(i) - b.charAt(i);
                    else{
                        i++;
                        if(i>=Math.min(a.length(),b.length())){
                            return a.length() - b.length();
                        }
                    }
                }
                
            }
            return map.get(a) - map.get(b);
        });
        return list;
    }
}

后言

上面是力扣图论专题,下一篇是其他的习题,希望有所帮助,一同进步,共勉!

相关推荐
憨憨2号1 分钟前
RUST学习笔记
笔记·学习·rust
小殷要努力刷题!5 分钟前
每日一刷——12.10——学习二叉树解题模式(1)
java·学习·算法·leetcode·二叉树·二叉树的建立
委婉待续9 分钟前
java抽奖系统登录下(三)
java·开发语言·状态模式
gz7seven9 分钟前
将分类数据划分为训练集、测试集与验证集
人工智能·算法·分类·数据划分·训练集·验证集·测试集
先睡12 分钟前
动态sql
java·数据库·sql
IT古董15 分钟前
【机器学习】机器学习的基本分类-无监督学习-主成分分析(PCA:Principal Component Analysis)
人工智能·学习·算法·机器学习·分类
人需要PID19 分钟前
【C语言练习(5)—回文数判断】
c语言·开发语言·学习·算法
喜欢AC~不爱WA25 分钟前
简单的Java小项目
java·开发语言
互联网动态分析30 分钟前
Apache Kafka:实时数据流处理的强大引擎
java·kafka
泰山小张只吃荷园34 分钟前
期末复习-计算机网络篇
java·网络·网络协议·计算机网络·面试