原题链接
实现方法1:for嵌套循环暴力枚举
因为有两个for循环嵌套,所以时间复杂度O(n^2)
因为是常数个临时变量,所以空间复杂度为O(1)
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();//这里事先计算了nums的大小防止重复计算
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return {i, j};
}
}
}
return {};
}
};
实现方法2:哈希表
一般哈希表都是用来快速判断一个元素是否出现集合里。
哈希表可以把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间。
这样的话我们就可以把寻找target-x的时间复杂度从O(n)降低到O(1)。
【用空间换时间】
相应的,由于要建立一个哈希表,就要占用一定的空间(数组长度),所以空间复杂度变成了O(n)
std::unordered_set底层实现为哈希表,无序,数值不可重复,亦不可修改,查询效率为O(1),增删效率也为O(1)。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {
auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {
return {it->second, i};
}
hashtable[nums[i]] = i;
}
return {};
}
};