LeetCode 399 除法求值
LeetCode 399 除法求值
給你一個變數對陣列
e
q
u
a
t
i
o
n
s
equations
equations 和一個實數值陣列
v
a
l
u
e
s
values
values 作為已知條件,其中
e
q
u
a
t
i
o
n
s
[
i
]
=
[
A
i
,
B
i
]
equations[i] = [A_i, B_i]
equations[i]=[Ai,Bi] 和
v
a
l
u
e
s
[
i
]
values[i]
values[i] 共同表示等式
A
i
B
i
=
v
a
l
u
e
s
[
i
]
\frac{A_i}{ B_i} = values[i]
另有一些以陣列 queries 表示的問題,其中 q u e r i e s [ j ] = [ C j , D j ] queries[j] = [C_j, D_j] queries[j]=[Cj,Dj] 表示第 j j j 個問題,請你根據已知條件找出 C j D j = ? \frac{C_j} {D_j} = ? DjCj=? 的結果作為答案。
返回 所有問題的答案 。如果存在某個無法確定的答案,則用 -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]
建圖+BFS~
把每一個除式的分子分母拆成兩個點,除式的值轉化為邊的權值即可,然後對每一次查詢進行一次 BFS 即可~
例如示例 1,建圖如下:
查詢
[
a
,
c
]
[a,c]
[a,c],就是從
a
a
a 點出發 BFS,到
c
c
c 點停止,經過的路徑邊權乘積就是答案,
[
a
,
c
]
=
6.00000
[a,c]=6.00000
[a,c]=6.00000
AC程式碼如下:
class Solution {
public:
vector<double>
calcEquation(vector<vector<string>> &equations, vector<double> &values, vector<vector<string>> &queries) {
unordered_map<string, unordered_map<string, double>> g;
unordered_map<string, bool> mp;
int n = equations.size();
for (int i = 0; i < n; i++) {
auto x = equations[i][0];
auto y = equations[i][1];
auto z = values[i];
g[x][y] = z;
g[y][x] = 1 / z;
mp[x] = mp[y] = 1;
}
vector<double> ans;
for (auto i:queries) {
string s = i[0], t = i[1];
int flag = 0;
if (mp[s] == 0 || mp[t] == 0) flag = 1, ans.push_back(-1);
else {
queue<string> q;
unordered_map<string, bool> vis;
unordered_map<string, double> num;
vis[s] = 1;
num[s] = 1;
q.push(s);
while (!q.empty()) {
string x = q.front();
q.pop();
if (x == t) {
flag = 1;
ans.push_back(num[x]);
break;
}
for (auto j:g[x]) {
if (!vis[j.first]) {
vis[j.first] = 1;
num[j.first] = num[x] * j.second;
q.push(j.first);
}
}
}
}
if (!flag) ans.push_back(-1);
}
return ans;
}
};