当前位置:网站首页>leetcode-399: division evaluation
leetcode-399: division evaluation
2022-07-31 01:44:00 【chrysanthemum bat】
题目
给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] .每个 Ai 或 Bi 是一个表示单个变量的字符串.
另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案.
返回 所有问题的答案 .如果存在某个无法确定的答案,则用 -1.0 替代这个答案.如果问题中出现了给定的已知条件中没有出现的字符串,也需要用 -1.0 替代这个答案.
注意:输入总是有效的.你可以假设除法运算中不会出现除数为 0 的情况,且不存在任何矛盾的结果.
示例 1:
输入:equations = [["a","b"],["b","c"]], values = [2.0,3.0], queries = [["a","c"],["b","a"],["a","e"],["a","a"],["x","x"]]
输出:[6.00000,0.50000,-1.00000,1.00000,-1.00000]
解释:
条件:a / b = 2.0, b / c = 3.0
问题:a / c = ?, b / a = ?, a / e = ?, a / a = ?, x / x = ?
结果:[6.0, 0.5, -1.0, 1.0, -1.0 ]
示例 2:
输入:equations = [["a","b"],["b","c"],["bc","cd"]], values = [1.5,2.5,5.0], queries = [["a","c"],["c","b"],["bc","cd"],["cd","bc"]]
输出:[3.75000,0.40000,5.00000,0.20000]
示例 3:
输入:equations = [["a","b"]], values = [0.5], queries = [["a","b"],["b","a"],["a","c"],["x","y"]]
输出:[0.50000,2.00000,-1.00000,-1.00000]

解题
方法一:并查集
Building a weighted directed graph+并查集
class UnionFind{
private:
vector<int> parent;
vector<double> weight;
public:
UnionFind(int n){
parent.resize(n);
weight.resize(n);
for(int i=0;i<n;i++){
parent[i]=i;
weight[i]=1;
}
}
int find(int index){
if(index==parent[index]) return index;
int origin=parent[index];
parent[index]=find(parent[index]);//At the same time, the parent node will be displayedweight也更新好
weight[index]*=weight[origin];
return parent[index];
}
void unite(int index1,int index2,double value){
int p1=find(index1);
int p2=find(index2);
if(p1!=p2){
parent[p1]=p2;
weight[p1]=weight[index2]*value/weight[index1];
}
}
double isConnected(int index1,int index2){
int p1=find(index1);
int p2=find(index2);
if(p1==p2){
return weight[index1]/weight[index2];
}
else return -1;
}
};
class Solution {
public:
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
int equationSize=equations.size();
UnionFind uf(2*equationSize);
// 第 1 步:预处理,将变量的值与 id 进行映射,使得并查集的底层使用数组实现,方便编码
unordered_map<string,int> mp;
int id=0;
for(int i=0;i<equationSize;i++){
vector<string> equation=equations[i];
string s1=equation[0];
string s2=equation[1];
if(!mp.count(s1)){
mp[s1]=id++;
}
if(!mp.count(s2)){
mp[s2]=id++;
}
uf.unite(mp[s1],mp[s2],values[i]);
}
// 第 2 步:做查询
int queriesSize=queries.size();
vector<double> res(queriesSize);
for(int i=0;i<queriesSize;i++){
string s1=queries[i][0];
string s2=queries[i][1];
if(!mp.count(s1)||!mp.count(s2)) res[i]=-1;
else res[i]=uf.isConnected(mp[s1],mp[s2]);
}
return res;
}
};
边栏推荐
猜你喜欢

Interprocess communication study notes

【网络安全】文件上传靶场通关(1-11关)

华为od 转骰子 js

ROS Action通信

ROS Action communication

Jiuzhou Cloud was selected into the "Trusted Cloud's Latest Evaluation System and the List of Enterprises Passing the Evaluation in 2022"

MySQL的存储过程

Word/Excel 固定表格大小,填写内容时,表格不随单元格内容变化

uniapp使用第三方字体

case语句的综合结果,你究竟会了吗?【Verilog高级教程】
随机推荐
初识C语言 -- 数组
The Meta Metaverse Division lost 2.8 billion in the second quarter, still want to continue to bet?Metaverse development has yet to see a way out
九州云获评云计算标准化优秀成员单位
C语言小程序 -- 常见经典练习题
Xiaohei's leetcode journey: 117. Fill the next right node pointer of each node II
软件测试要达到一个什么水平才能找到一份9K的工作?
leetcode-1161:最大层内元素和
软件测试工作3年了,谈谈我是如何从刚入门进阶到自动化测试的?
Distributed. Idempotency
TiDB 在长银五八消费金融核心系统适配经验分享
Set the browser scrollbar style
斩获BAT、TMD技术专家Offer,我都经历了什么?
华为od 转骰子 js
Installation problem corresponding to tensorflow and GPU version
Nacos
【Map与Set】之LeetCode&牛客练习
什么是理想的大学生活?
《云原生的本手、妙手和俗手》——2022全国新高考I卷作文
蓝牙mesh系统开发三 Ble Mesh 配网器 Provisioner
【网络安全】文件上传靶场通关(1-11关)