当前位置: 首页 > news >正文

算法题练习

课程表

 public boolean canFinish(int n, int[][] p) {

        // 1. 准备⼯作

        int[] in = new int[n]; // 统计每⼀个顶点的⼊度

        Map<Integer, List<Integer>> edges = new HashMap<>(); // 邻接表存图

        // 2. 建图

        for (int i = 0; i < p.length; i++) {

            int a = p[i][0], b = p[i][1]; // b -> a

            if (!edges.containsKey(b)) {

                edges.put(b, new ArrayList<>());

            }

            edges.get(b).add(a);

            in[a]++;

        }

        // 3. 拓扑排序

        Queue<Integer> q = new LinkedList<>();

        // (1) 先把⼊度为 0 的点,加⼊到队列中

        for (int i = 0; i < n; i++) {

            if (in[i] == 0)

                q.add(i);

        }

        // (2) bfs

        while (!q.isEmpty()) {

            int t = q.poll();

            for (int a : edges.getOrDefault(t, new ArrayList<>())) {

                in[a]--;

                if (in[a] == 0)

                    q.add(a);

            }

        }

        // 4. 判断是否有环

        for (int x : in)

            if (x != 0)

                return false;

        return true;

    }

课程表2(就多了一个统计的过程)

 public int[] findOrder(int n, int[][] p) {

        // 1. 准备⼯作

        int[] in = new int[n]; // 统计每⼀个顶点的⼊度

        Map<Integer, List<Integer>> edges = new HashMap<>(); // 邻接表存图

        // 2. 建图

        for (int i = 0; i < p.length; i++) {

            int a = p[i][0], b = p[i][1]; // b -> a

            if (!edges.containsKey(b)) {

                edges.put(b, new ArrayList<>());

            }

            edges.get(b).add(a);

            in[a]++;

        }

        // 3. 拓扑排序

        Queue<Integer> q = new LinkedList<>();

        int[] ret = new int[n];

        int index = 0;

        // (1) 先把⼊度为 0 的点,加⼊到队列中

        for (int i = 0; i < n; i++) {

            if (in[i] == 0)

                q.add(i);

        }

        // (2) bfs

        while (!q.isEmpty()) {

            int t = q.poll();

            ret[index++] = t;

            for (int a : edges.getOrDefault(t, new ArrayList<>())) {

                in[a]--;

                if (in[a] == 0)

                    q.add(a);

            }

        }

        // 4. 判断是否有环

       if(index ==n)

         return ret;

        return new int[0];

   

    }

   Map<Character, Set<Character>> edges = new HashMap<>(); // 邻接表

    Map<Character, Integer> in = new HashMap<>(); // 统计每个节点的⼊度

    boolean check;

    public String alienOrder(String[] words) {

        // 1. 初始化⼊度哈希表 + 建图

        for (String s : words) {

            for (int i = 0; i < s.length(); i++) {

                char ch = s.charAt(i);

                in.put(ch, 0);

            }

        }

        int n = words.length;

        for (int i = 0; i < n; i++) {

            for (int j = i + 1; j < n; j++) {

                add(words[i], words[j]);

                if (check == true)

                    return "";

            }  

        }

        // 2. 拓扑排序

        Queue<Character> q = new LinkedList<>();

        for (char ch : in.keySet()) {

            if (in.get(ch) == 0)

                q.add(ch);

        }

        StringBuffer ret = new StringBuffer();

        while (!q.isEmpty()) {

            char t = q.poll();

            ret.append(t);

            for (char ch : edges.getOrDefault(t,new HashSet<>())) {

                in.put(ch, in.get(ch) - 1);

                if (in.get(ch) == 0)

                    q.add(ch);

            }

        }

        // 3. 判断

        for (char ch : in.keySet()) {

            if (in.get(ch) != 0)

                return "";

        }

        return ret.toString();

    }

    public void add(String s1, String s2) {

        int n = Math.min(s1.length(), s2.length());

        int i = 0;

        for (; i < n; i++) {

            char c1 = s1.charAt(i), c2 = s2.charAt(i);

            if (c1 != c2) {

                if (!edges.containsKey(c1)) {

                    edges.put(c1, new HashSet<>());  

                }

                if (!edges.get(c1).contains(c2)) {

                    edges.get(c1).add(c2);

                    in.put(c2, in.get(c2) + 1);

                }

                break;

            }

        }

        if (i == s2.length() && i < s1.length())

            check = true;

    }

http://www.lqws.cn/news/586477.html

相关文章:

  • 前端Vue面试八股常考题(一)
  • 【STM32HAL-第1讲 基础篇-单片机简介】
  • Redis Lua 调试器(LDB)完全指南
  • 具身智能的仿真技术(具身智能入门三)
  • 用Python采集CBC新闻:如何借助青果网络海外代理IP构建稳定采集方案
  • datax-web报错:连接数据库失败. 请检查您的 账号、密码、数据库名称、IP、Port或者向 DBA 寻求帮助(注意网络环境)
  • NAT 类型及 P2P 穿透
  • 信创项目oracle数据库迁移到达梦数据库需要会有哪些问题?如何解决?
  • Linux云计算基础篇(2)
  • 2025年6月个人工作生活总结
  • 【Springai】项目实战进度和规划
  • SpringCloud系列(42)--搭建SpringCloud Config分布式配置总控中心(服务端)
  • 个人博客开发问题记录:ThreadLocal获取用户数据失败
  • 《用奥卡姆剃刀原理,为前端开发“减负增效”》
  • CentOS 7 8 安装 madam
  • LLaMA-Factory框架之参数详解
  • (LangChain)RAG系统链路之嵌入模型Embedding(三)
  • spring-ai 工作流
  • 深入理解CSS定位:掌握网页布局的核心技术
  • SpringBoot 启动入口深度解析:main方法执行全流程
  • 【Python使用】嘿马云课堂web完整实战项目第2篇:CMS页面管理需求,后端工程搭建【附代码文档】
  • C++ 安装使用教程
  • Git命令使用心得
  • LeetCode 594. 最长和谐子序列
  • if __name__ == ‘__main__‘:
  • 【嵌入式ARM汇编基础】-ELF文件格式内部结构详解(三)
  • IDEA相关配置记录
  • 对selenium进行浏览器和驱动进行配置Windows | Linux
  • 【机器学习第四期(Python)】LightGBM 方法原理详解
  • Excel Report