1. 程式人生 > 其它 >LeetCode 399 除法求值

LeetCode 399 除法求值

技術標籤:LeetCode圖論BFS

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]

BiAi=values[i] 。每個 A i A_i Ai B i B_i Bi 是一個表示單個變數的字串。

另有一些以陣列 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;
    }
};