Two Sum (LeetCode)
Question:
https://oj.leetcode.com/problems/two-sum/
要快速知道另外一个值存在不存在,只有利用hash table. 最开始想错了,先对整个array建立hash table,然后还要考虑某些点值相同的情况,其实没有必要。因为当前点只需要跟以前的点比较。
因为只需要一个答案,找到一个就可以推出循环了。同时不需要操心duplicate value的问题。比如target=6, array={3,...., 3....},当遇到第二个3的时候,我们就得到结果,不需要继续处理。如果target是5,我们前面已经有一个3了,第二个3就完全可以忽略了。
vector<int> twoSum(vector<int> &numbers, int target) { vector<int> result; Hash1(result, numbers, target); return result; } void Hash1(vector<int>& result, vector<int>& numbers, int target) { std::unordered_map<int, int> table; for (int i = 0; i < numbers.size(); i++) { int value = target - numbers[i]; if (table.find(value) != table.end()) { result.push_back(table[value]+1); result.push_back(i+1); break; } table[numbers[i]] = i; } }
想多了的解法:
void Hash(vector<int>& result, vector<int>& numbers, int target) { std::unordered_map<int, vector<int>> table; for (int i = 0; i < numbers.size(); i++) { table[numbers[i]].push_back(i); } for (int i = 0; i < numbers.size(); i++) { int value = target - numbers[i]; if (table.find(value) != table.end()) { if (value != numbers[i] || table[value].size() > 1) { int index1 = i; int index2 = table[value][0]; if (index1 == index2) index2 = table[value][1]; result.push_back(index1 < index2 ? index1+1 : index2+1); result.push_back(index1 < index2 ? index2+1 : index1+1); break; } } } }
浙公网安备 33010602011771号