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

后言

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

相关推荐
还是鼠鼠8 小时前
【Spring AI智能体实战 01】Java开发者接入大模型:国内平台、Token与API Key入门
java·大模型·spring ai·deepseek·阿里云百炼
zerozrc09 小时前
Java Lambda 底层实现
java
白白白小纯9 小时前
每日算法day3—回文链表,链表分割
c语言·数据结构·算法·leetcode
编程风暴9 小时前
3类人群的数据分析实习类型选择+4条选错红线
java·前端·数据分析
一只小菜鸡..9 小时前
南京大学 操作系统 (JYY) 学习笔记:文件系统实现——从 FAT、ext2 到现代 B-Tree 黑科技
笔记·科技·学习
深爱水瓶 血影S狂风9 小时前
Linux.NET学习手记(2)
linux·学习·.net
明明真系叻9 小时前
RAG学习(1)
学习·rag
钱六两9 小时前
Spring AI 使用 MCP 客户端(调用高德 MCP)
java·人工智能·spring
城管不管9 小时前
RabbitMQ死信队列
java·分布式·ai·面试·职场和发展·rabbitmq·agent
手写码匠9 小时前
华为云Flexus+DeepSeek征文|Dify 构建企业级联网搜索 Agent:查询改写、多源检索与引用溯源实战
人工智能·深度学习·算法·aigc