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