evaluate division
- 问题来源
- 问题简介
给出一系列式子 a / b = k(k为非零小数),要求算出指定的算式,如:
给出 a / b = 2.0, b / c = 3.0;
则求 a / c。
结果: 6.0
若求不出,则为 -1。
解题思路
时间复杂度 | 空间复杂度 |
---|---|
O(未知) | O(未知) |
Code
class Solution { public: vector<double> calcEquation(vector<pair<string, string>> equations, vector<double>& values, vector<pair<string, string>> queries) { unordered_map<string, unordered_map<string, double>> next; unordered_set<string> all; pair<string, string> cur; double val; for (int i = 0, len = equations.size(); i < len; i++) { cur = equations[i]; val = values[i]; next[cur.first][cur.second] = val; next[cur.second][cur.first] = 1 / val; all.insert(cur.first); all.insert(cur.second); } vector<double> rs(queries.size(), -1.0); auto it = rs.begin(); for (auto &i : queries) { auto a_c = all; if (next.find(i.first) == next.end() || next.find(i.second) == next.end()) { *it++ = -1; } else { *it++ = dfs(i.first, i.second, next, a_c); } } return rs; }
double dfs(const string &cur, const string &goal, unordered_map<string, unordered_map<string, double>> &next, unordered_set<string> &all) { if (cur == goal) { return next.find(cur) != next.end() ? !!(next[cur].begin() -> second) : -1; } if (next[cur].find(goal) != next[cur].end()) { return next[cur][goal]; } all.erase(cur); auto &next_set = next[cur]; double nextVal = -1; for (auto &i : next_set) { if (all.find(i.first) == all.end()) { continue; } nextVal = dfs(i.first, goal, next, all); if (nextVal != -1) { return nextVal * i.second; } } return -1; }
};