力扣399. 除法求值

广度优先搜索

  • 思路:
    • 题目梳理
      • 输入信息里包含 A / B = val;
      • 输入一堆 A' / B' 需要求出它们的比值;
    • 以操作数为节点,构建权重图,节点对应了关联节点及其比值;
    • 可以进行简单的处理,将代数变量映射为整数数值,着上述图可以的节点键值转化为数组的下标;
      • for (int i = 0; i < size; ++i) {if (variables.find(equations[i][0]) == variables.end()) {variables[equations[i][0]] = nvars++;}if (variables.find(equations[i][1]) == variables.end()) {variables[equations[i][1]] = nvars++;}
        }std::vector<std::vector<std::pair<int, double>>> digraph(nvars);
        for (int i = 0; i < size; ++i) {int nodeA = variables[equations[i][0]];int nodeB = variables[equations[i][1]];digraph[nodeA].push_back(std::make_pair(nodeB, values[i]));digraph[nodeB].push_back(std::make_pair(nodeA, 1.0 /values[i]));
        }

    • 遍历求解的代数式:
      • 如果变量不在已知的哈希表中,则结果为 -1.0;
      • 如果两个变量相等,则结果为 1.0;
      • 否则就可以从起点出发,通过广度优先搜索的方式,不断更新起点与当前点之间的路径长度,直到搜索到终点为止;
        • // bfs
          std::queue<int> qu;
          qu.push(na);
          // result for search ratio
          std::vector<double> ratio(nvars, -1.0);
          ratio[na] = 1.0;
          while (!qu.empty() && ratio[nb] < 0) {int x = qu.front();qu.pop();for (const auto [y, v] : digraph[x]) {if (ratio[y] < 0) {ratio[y] = ratio[x] * v;qu.push(y);}}
          }val = ratio[nb];

  • 完整代码
class Solution {
public:vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {int nvars = 0;std::unordered_map<std::string, int> variables;int size = equations.size();for (int i = 0; i < size; ++i) {if (variables.find(equations[i][0]) == variables.end()) {variables[equations[i][0]] = nvars++;}if (variables.find(equations[i][1]) == variables.end()) {variables[equations[i][1]] = nvars++;}}std::vector<std::vector<std::pair<int, double>>> digraph(nvars);for (int i = 0; i < size; ++i) {int nodeA = variables[equations[i][0]];int nodeB = variables[equations[i][1]];digraph[nodeA].push_back(std::make_pair(nodeB, values[i]));digraph[nodeB].push_back(std::make_pair(nodeA, 1.0 /values[i]));}std::vector<double> result;for (const auto & q : queries) {double val = -1.0;// all of the var existif (variables.find(q[0]) != variables.end() &&variables.find(q[1]) != variables.end()) {// node value from the graphint na = variables[q[0]];int nb = variables[q[1]];if (na == nb) {val = 1.0;} else {// bfsstd::queue<int> qu;qu.push(na);// std::vector<double> ratio(nvars, -1.0);ratio[na] = 1.0;while (!qu.empty() && ratio[nb] < 0) {int x = qu.front();qu.pop();for (const auto [y, v] : digraph[x]) {if (ratio[y] < 0) {ratio[y] = ratio[x] * v;qu.push(y);}}}val = ratio[nb];}}result.push_back(val);}return result;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/621357.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

数据分析---SQL(3)

目录 IF和CASE WHEN的区别IF函数示例CASE WHEN示例如何求字段整体的标准差和均值什么是笛卡尔积笛卡尔积通常的使用场景是什么rank、dense rank、row number的区别rank函数示例dense rank函数示例row number函数示例什么是窗口函数除了rank之外还有哪些窗口函数IF和CASE WHEN的…

阿里云ingress配置时间超时的参数

一、背景 在使用阿里云k8s集群的时候&#xff0c;内网API网关&#xff0c;刚开始是用的是Nginx&#xff0c;后面又搭建了ingress。 区别于nginx配置&#xff0c;ingress又该怎么设置参数呢&#xff1f;比如http超时时间等等。 本文会先梳理nginx是如何配置&#xff0c;再对比…

优雅的删除链表元

王有志&#xff0c;一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群&#xff1a;共同富裕的Java人 在数据结构&#xff1a;链表中&#xff0c;我们实现了链表的删除方法&#xff0c;但代码看起来并不“优雅”&#xff0c;那么今天我们就来尝试使用多种方法&#xff0c…

Halcon 3D相关算子(二)

(1) moments_object_model_3d( : : ObjectModel3D, MomentsToCalculate : Moments) 功能&#xff1a;计算3D对象模型的平均值或中心二阶矩。要计算3D物体模型点的平均值&#xff0c;在MomentsToCalculate中选择mean_points&#xff1b;如果要计算二阶中心矩&#xff0c;则选择…

windows安装conda环境,开发openai应用准备,运行第一个ai程序

文章目录 前言一、windows创建openai开发环境二、国内代理方式访问openai的方法&#xff08;简单方法&#xff09;三、测试运行第一个openai程序总结 前言 作者开发第一个openai应用的环境准备、第一个openai程序调用成功&#xff0c;做个记录&#xff0c;希望帮助新来的你。 …

如何处理Uniapp中的异步请求?

在Uniapp中处理异步请求有以下几种方法&#xff1a; 使用 uni.request 方法发送异步请求&#xff0c;该方法返回一个 Promise 对象&#xff0c;可以使用 then 方法处理请求成功的回调&#xff0c;使用 catch 方法处理请求失败的回调。 uni.request({url: http://api.example.…

鸿蒙系统ArkTs语法入门

鸿蒙系统ArkTs的ts语法入门 前言1. 变量声明2. 数据类型2.1 基本数据类型2.2 复杂数据类型2.3 联合类型2.4 空类型和未定义类型 3. 函数3.1 匿名函数和箭头函数 4. 类和接口类的访问权限接口类的继承内部类 7. 结构体参考材料 前言 每个语言都有控制流语句就不写测试代码了。a…

31 树的存储结构一

无法直接用数组表示树的逻辑结构&#xff0c;但是可以设计结构体数组对节点间的关系进行描述&#xff1a;【如表】 这样做的问题&#xff1a; 可以利用 组织链表 parent指针&#xff1a; 注意&#xff1a;树结点在 组织链表 中的位置不代表树的任何逻辑关系 树的架构图&#xf…

从0开始学Git指令(3)

从0开始学Git指令 因为网上的git文章优劣难评&#xff0c;大部分没有实操展示&#xff0c;所以打算自己从头整理一份完整的git实战教程&#xff0c;希望对大家能够起到帮助&#xff01; 远程仓库 Git是分布式版本控制系统&#xff0c;同一个Git仓库&#xff0c;可以分布到不…

ubuntu主机开启ssh服务,ubuntu通过ssh访问主机

1.ubuntu通过ssh访问主机 要在Ubuntu上通过SSH&#xff08;Secure Shell&#xff09;访问另一台主机&#xff0c;您需要确保几件事情&#xff1a; 目标主机上的SSH服务器&#xff1a;确保您要访问的主机上安装并运行了SSH服务器&#xff08;例如OpenSSH服务器&#xff09;。 …

java客户端连接redis并设置序列化处理

1、导入依赖 <!--继承父依赖--> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup paren…

服务器出现500、502、503错误的原因以及解决方法

服务器我们经常会遇到访问不了的情况有的时候是因为我们服务器被入侵了所以访问不了&#xff0c;有的时候是因为出现了服务器配置问题&#xff0c;或者软硬件出现问题导致的无法访问的问题&#xff0c;这时候会出现500、502、503等错误代码。基于以上问题我们第一步可以先重启服…

Chapter 7 类和对象的特性(上篇)

目的&#xff1a;认识类&#xff0c;对面向对象产生认识 &#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1f4ca;&#x1…

【Py/Java/C++三种语言详解】LeetCode每日一题240114【链表】LeetCode83、删除排序链表中的重复节点

文章目录 题目链接题目描述解题思路代码PythonJavaC时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目链接 LeetCode83、删除排序链表中的重复节点 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返…

Android json功能解析

1. 简介 JAVAScript Object Notation是一种轻量级的数据交换格式具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案&#xff08;有点类似于正则表达式 &#xff0c;获得了当今大部分语言的支持&#xff09;。  JSON采用兼容性很高的文本格式&#xf…

第 380 场周赛 解题报告 | 珂学家 | 数位DP 二分 + 字符串Hash

前言 整体评价 感觉T3更难些&#xff0c;T4太直接了&#xff0c;一般的KMP/StringHash基本就够用了。 上周T4出数位DP&#xff0c;估计是为T3打了一个铺垫。 A. 最大频率元素计数 思路: 模拟即可 class Solution {public int maxFrequencyElements(int[] nums) {Map<Int…

qt5.14.2配置opencv4.5.5

使用环境&#xff1a;windows&#xff0c;opencv4.5.5&#xff0c;qt5.14.2&#xff0c;msvc编译器 这里的opencv文件是已经编译好了&#xff0c;在qt工程中配置就可使用&#xff0c;编译器得是msvc才行&#xff0c;MinGW不管用。 资源地址&#xff1a;https://download.csdn.…

【深度学习每日小知识】Computer Vision 计算机视觉

计算机视觉是人工智能的一个领域&#xff0c;涉及算法和系统的开发&#xff0c;使计算机能够解释、理解和分析来自周围世界的视觉数据。这包括从静态图像到视频流甚至 3D 环境的一切。 使用对象检测和特征提取等方法&#xff0c;计算机视觉本质上需要从视觉输入中提取有用信息…

javascript,setTimeout定时器的精度可能不高,javascript引擎不是你想的那样

javascript引擎&#xff0c;它运行在宿主环境中&#xff0c;对前端来说&#xff0c;一般是web浏览器&#xff0c; 代码运行到浏览器。 专业术语: 事件循环&#xff1a;浏览器提供了一种机制来处理程序中多个块的执行&#xff0c;且执行每块时调用javascript引擎,这种机制被称为…