当前位置:网站首页>leetcode-399:除法求值
leetcode-399:除法求值
2022-07-31 01:33:00 【菊头蝙蝠】
题目
给你一个变量对数组 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]
解题
方法一:并查集
构建带权有向图+并查集
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]);//同时会把父节点的weight也更新好
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;
}
};
边栏推荐
猜你喜欢
C language _ structure pointer array function voting system
ShardingSphere's public table combat (7)
Problem record in the use of TypeScript
网站频繁出现mysql等数据库连接失败等信息解决办法
【952. Calculate the maximum component size according to the common factor】
斩获BAT、TMD技术专家Offer,我都经历了什么?
ECCV 2022 华科&ETH提出首个用于伪装实例分割的一阶段Transformer的框架OSFormer!代码已开源!
软件测试要达到一个什么水平才能找到一份9K的工作?
【Map与Set】之LeetCode&牛客练习
MySQL高级-六索引优化
随机推荐
Mysql:Invalid default value for TIMESTAMP
VS warning LNK4099: No solution found for PDB
Multiplication, DFS order
Rocky/GNU之Zabbix部署(1)
MySql的初识感悟,以及sql语句中的DDL和DML和DQL的基本语法
Xiaohei's leetcode journey: 117. Fill the next right node pointer of each node II
1782. 统计点对的数目 双指针
Google官方控件ShapeableImageView使用
MySQL的存储过程
Xiaohei's leetcode journey: 104. The maximum depth of a binary tree
GCC Rust获批将被纳入主线代码库,或将于GCC 13中与大家见面
网站频繁出现mysql等数据库连接失败等信息解决办法
Typescript14 - (type) of the specified parameters and return values alone
太阳能板最大面积 od js
case语句的综合结果,你究竟会了吗?【Verilog高级教程】
keep-alive缓存组件
分布式.分布式锁
射频器件的基本参数2
《实战》基于电商领域的词性提取及其决策树模型建模
SQLserver查询最近三个月的数据,语句该怎么写sqlserver