力扣-图论-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;
    }
}

后言

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

相关推荐
努力的小帅几秒前
C++_哈希
开发语言·c++·学习·算法·哈希算法·散列表
小蒜学长几秒前
基于Spring Boot的火灾报警系统的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
武昌库里写JAVA2 分钟前
基于Spring Boot + Vue3的办公用品申领管理系统
java·spring boot·后端
中国lanwp3 分钟前
Spring Boot的配置文件加载顺序和规则
java·spring boot·后端
我命由我123459 分钟前
Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
android·java·java-ee·android studio·安卓·android-studio·android runtime
Christo320 分钟前
TFS-2023《Fuzzy Clustering With Knowledge Extraction and Granulation》
人工智能·算法·机器学习·支持向量机
过河卒_zh156676621 分钟前
AI内容标识新规实施后,大厂AI用户协议有何变化?(二)百度系
人工智能·算法·aigc·算法备案·生成合成类算法备案
zzZ656522 分钟前
支持向量机(SVM)学习报告
学习·机器学习·支持向量机
知彼解己32 分钟前
深入理解 AbstractQueuedSynchronizer (AQS):Java 并发的排队管家
java·开发语言
薰衣草233335 分钟前
滑动窗口(2)——不定长
python·算法·leetcode