399. Evaluate Division

在这里插入图片描述

这题一开始想法有些问题,然后纠正后,写的时候反复出现各种小问题,这些都是可以避免而且在面试中会减分的,真想扇自己一巴掌。。

因为这里我在dfs的过程中只用了乘法,那么它的source和target就分别是被除数和除数,顺序不能乱。但是在计算这种情况:给出a/b, a/c,要求b/c,如果说我只把b和c压入a的邻接表里面,这样就得不出正确答案;需要再反一下,把a压入b的邻接表,把a压入c的邻接表,这样才能由b找到a,再由a找到c。一开始忽略了这种情况,导致了错误。

class Solution {
public:
    vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
        unordered_map<string, vector<string>> adjs;
        map<pair<string, string>, double> valueMap;
        for (int i = 0; i < equations.size(); ++i) {
            auto& source = equations[i][0];
            auto& target = equations[i][1];
            adjs[source].push_back(target);
            valueMap[make_pair(source, target)] = values[i];
            adjs[target].push_back(source);
            valueMap[make_pair(target, source)] = 1.0/values[i];
        }
        unordered_set<string> visited;
        vector<double> ret;
        for (auto& query : queries) {
            auto& source = query[0];
            auto& target = query[1];
            if (adjs.find(source) == adjs.end()) {
                ret.push_back(-1.0);
                continue;
            }
            if (source == target) {
                ret.push_back(1.0);
                continue;
            }
            visited.clear();
            double v = dfs(adjs, valueMap, source, target, visited);
            if (v != 0) {
                ret.push_back(v);
                continue;
            }
            visited.clear();
            v = dfs(adjs, valueMap, target, source, visited);
            ret.push_back(v == 0.0? -1.0 : 1.0/v);
        }
        return ret;
    }
private:
    double dfs(unordered_map<string, vector<string>>& adjs, map<pair<string, string>, double>& valueMap, string source, string target, unordered_set<string>& visited) {
        if (adjs.find(source) == adjs.end())
            return 0.0;
        auto& vec = adjs[source];
        for(auto& str : vec) {
            if (str == target)
                return valueMap[make_pair(source, target)];
            if (visited.find(str) != visited.end())
                continue;
            visited.insert(str);
            double v = dfs(adjs, valueMap, str, target, visited);
            visited.erase(str);
            if (v != 0)
                return v * valueMap[make_pair(source, str)];
        }
        return 0.0;
    }
};

可恶的是,想到这个思路了,写的时候还反复出现各种错误,让人头大。可能图的问题我还是不熟吧,还得多练练

posted @ 2019-09-18 12:12  于老师的父亲王老爷子  阅读(11)  评论(0编辑  收藏  举报