力扣-图论-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 分钟前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
蓝田~22 分钟前
大模型本地部署与远程调用 — 从 API 到 Agent
java·人工智能·claude·claude code
码农进化录28 分钟前
Java 程序员的 AI 进化论 | Spring Boot 接入 OpenAI 的六个坑,全帮你踩了
java·spring boot·openai
To_OC35 分钟前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
疯狂成瘾者37 分钟前
Java 常见集合方法
java·windows·python
从此以后自律38 分钟前
ConcurrentHashMap 超详细详解
java
To_OC44 分钟前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode
数字杂技师1 小时前
每条推荐都很准,为什么我还是越刷越无聊?
算法
兰令水1 小时前
hot100【acm版】【2026.7.14打卡-java版本】
java·数据结构·算法·leetcode·面试
Amazing_Cacao1 小时前
CFCA精品可可产区风土解析(美洲):无情打破风味堆叠假象,建立时间轴上的层次动态阅读系统
学习