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

后言

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

相关推荐
胡尔摩斯.4 分钟前
Micrometer+Zipkin 分布式链路追踪
java·后端·spring cloud
刘鑫磊up11 分钟前
第十二章:算法与程序设计
算法·算法与程序设计
羽落9613 分钟前
左神算法基础提升--3
算法
云边有个稻草人15 分钟前
【优选算法】三数之和(双指针算法)
笔记·算法·双指针算法
凌小添17 分钟前
Python入门教程丨2.3 流程控制、算法效率分析及优化
python·算法
像污秽一样24 分钟前
AI刷题-小R的随机播放顺序、不同整数的计数问题
开发语言·c++·算法
懒大王爱吃狼36 分钟前
【数据分析与可视化】Python绘制数据地图-GeoPandas地图可视化
开发语言·python·学习·数据挖掘·数据分析·python基础·python学习
竹下为生38 分钟前
LeetCode --- 432周赛
算法·leetcode·职场和发展
松桥爸(仁勇)42 分钟前
【72课 局部变量与全局变量】课后练习
c++·算法
begei44 分钟前
工作中常用springboot启动后执行的方法
java·spring boot·后端