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

力扣面试150题--除法求值

Day 62

题目描述

在这里插入图片描述

做法

此题本质是一个图论问题,对于两个字母相除是否存在值,其实就是判断,从一个字母能否通过其他字母到达,做法如下:

  1. 遍历所有等式,为每个变量分配唯一的整数索引。
  2. 初始化一个二维数组 graph,其中 graph[i][j] 表示变量 i 除以变量 j 的比值。
  3. 对于每个等式 a/b = v,设置 graph[a][b] = v 和 graph[b][a] = 1/v。
  4. 每个变量自身的比值为 1.0,即 graph[i][i] = 1.0。
  5. 对于每个查询 a/b,检查变量是否存在于映射中。如果存在,使用 DFS 查找从 a 到 b 的路径,并计算路径上的比值乘积。如果路径不存在,返回 -1.0。
class Solution {public double find(double[][] graph, int x, int y, boolean[] visited) {//判断x到y是否可达if (graph[x][y] != 0) {return graph[x][y];//直接可达}visited[x] = true;for (int i = 0; i < graph.length; i++) {if (graph[x][i] != 0 && !visited[i]) {double p = find(graph, i, y, visited);if (p != 0.0) {return p * graph[x][i];}}}return 0;}public double[] calcEquation(List<List<String>> equations, double[] values, List<List<String>> queries) {Map<String, Integer> num = new HashMap<>();//字符串到数字序号的转换int x = 0, y = 0;String a, b;for (int i = 0; i < equations.size(); i++) {a = equations.get(i).get(0);b = equations.get(i).get(1);if (!num.containsKey(a)) {num.put(a, x);x++;}if (!num.containsKey(b)) {num.put(b, x);x++;}}double[][] graph = new double[x][x];for (int i = 0; i < equations.size(); i++) {a = equations.get(i).get(0);b = equations.get(i).get(1);x = num.get(a);y = num.get(b);graph[x][y] = values[i];//x/ygraph[y][x] = 1 / values[i];//y/x}for (int i = 0; i < graph.length; i++) {graph[i][i] = 1.0;//对角线全为1}//图初始化结束double[] res = new double[queries.size()]; //结果集合double sum = 0.0;for (int i = 0; i < queries.size(); i++) {a = queries.get(i).get(0);b = queries.get(i).get(1);if (!num.containsKey(a) || !num.containsKey(b)) {res[i] = -1.0;continue;}x = num.get(a);y = num.get(b);boolean[] visited = new boolean[graph.length];sum = find(graph, x, y, visited);//判断x到y是否可达if (sum == 0) {//不可达sum = -1.00000;}res[i] = sum;sum = 0.0;}return res;}
}
http://www.xdnf.cn/news/12565.html

相关文章:

  • 计算矩阵A和B的乘积
  • 基于Python学习《Head First设计模式》第八章 模板方法模式
  • Readest(电子书阅读器) v0.9.53
  • 缓存一致性 与 执行流
  • STM32学习笔记:外部中断(EXTI)原理与应用详解
  • 什么是可恢复保险丝
  • 永恒之蓝(CVE-2017-0146)详细复现
  • day49 python 注意力热图
  • Oracle 客户端深度指南:SQL Developer 与 PL/SQL Developer 全面安装使用教程
  • MySQL中的内置函数
  • 深入剖析Nginx:从入门到高并发架构实战
  • day24 元组和OS模块
  • 十、【ESP32开发全栈指南: TCP客户端】
  • LinkedList、Vector、Set
  • 嵌入式学习笔记 - freeRTOS vTaskPlaceOnEventList()函数解析
  • VirtualBox启动失败@Ubuntu22.04 说是配置文件有问题
  • 使用ORM Bee (ormbee) ,如何利用SQLAlchemy的模型生成数据库表.
  • “组件、路由懒加载”,在 Vue3 和 React 中分别如何实现? (copy)
  • 使用Python和Flask构建简单的机器学习API
  • MySQL事务与锁中的MVCC 深度解析与面试题讲解
  • Spring AI 核心工作流
  • 每日Prompt:治愈动漫插画
  • 基于深度学习的金枪鱼各类别目标检测含完整数据集
  • Strong Baseline: Multi-UAV Tracking via YOLOv12 with BoT-SORT-ReID 2025最新无人机跟踪
  • 【C/C++】实现固定地址函数调用
  • 2种官方方法关闭Windows防火墙
  • iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform
  • 将单体架构项目拆分成微服务时的两种工程结构
  • 阿里云MaxCompute入门
  • 堆排序的详细解读