暴力枚举的时间复杂度过高,这里可以使用哈希表来降低时间复杂度。
对于每一个 x,我们首先查询哈希表中是否存在 target - x,存在,这输出,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。键为nums数组的值,值为nums数组的索引,查找哈希表的时候,只需find函数寻找target-x即可。
这样对于每一个数字,只会遍历一次,可以将寻找 target - x 的时间复杂度降低到从 O(N)O(N) 降低到 O(1)O(1)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hash;//创建
for (int i = 0; i<nums.size(); ++i) {
//通过p遍历哈希表的键,判断target-x是否存在
auto p = hash.find(target - nums[i]);
//若不存在,则p=hash.end(),即哈希表查找完了也未发现target-x,指向.end()
if (p != hash.end()) {
//返回索引
return {p->second, i};
}
//键为nums的值,值为nums的索引,所以上面返回时为p->second
hash[nums[i]] = i;
}
//遍历一次依旧未找到,说明不存在,返回空的vector
return {};
}
};
后面一个为第一种双重暴力遍历枚举的时间复杂度,差了22倍,xs。