JZ57 和为S的两个数字
评价:
没写出来,看了解析。这是道很有意思的题。
有思路,但时间复杂度O(n^2)超时。
分析:
本题的输入序列元素个数是小于1000000,看到这个你就得知道没法用双重循环了。时间复杂度太高O(n^2)。
本题用到了一个哈希表的特征:查询时间复杂度O(1)-O(n),所以时间复杂度比我的双重循环低
且本题搜索的是两数之和,而不是三数四数,,你可以看看JZ74 和为S的连续正数序列
这题就没法用hash了。
所以本题才能用hash表解决问题。
思路:
class Solution {
public:vector<int> FindNumbersWithSum(vector<int> array,int sum) { // // Step0.特殊情况处理if(array.empty()) return vector<int>{};unordered_map<int, int> hash; // k-v : array元素-是否出现过// Step1.遍历array,搜索它的和差数是否存在 ? 得到结果 : 将它加入hashfor(int i=0; i<array.size(); i++){if(hash.count(sum - array[i]))return vector<int>{array[i], sum-array[i]};elsehash[array[i]] = 1;}return vector<int>{};}
};
运行时间:36ms 占用内存:5096KB