暴力:(还是垃圾暴力版本)
class Solution {
public:
vector twoSum(vector& nums, int target) {
vector ans;
for(int i=0;i
优化暴力思路:
枚举数组中的每一个数 x,寻找数组中是否存在 target - x。
当我们使用遍历整个数组的方式寻找 target - x 时,需要注意到每一个位于 x 之前的元素都已经和 x 匹配过,因此不需要再进行匹配。而每一个元素不能被使用两次,所以我们只需要在 x 后面的元素中寻找 target - x。
class Solution {
public:
vector twoSum(vector& nums, int target) {
int n = nums.size();
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 {};
}
};
用哈希表优化:
用哈希表unordered_map
键值对分别为数组值和数组下标,注意,遍历每一个数组元素,在哈希表里找,没找到的话就将这个键值对存到哈希表里,找到了就输出。这里用的是count函数。
时间复杂度:O(N),其中 N是数组中的元素数量。对于每一个元素 x,我们可以O(1) 地寻找 target - x。
空间复杂度:O(N),其中 N是数组中的元素数量。主要为哈希表的开销。
class Solution {
public:
vector twoSum(vector& nums, int target) {
unordered_map hashtable;
for (int i = 0; i < nums.size(); ++i) {
if (hashtable.count(target-nums[i])) {
return {hashtable[target-nums[i]], i};
}
hashtable[nums[i]]=i;//往哈希表里加入这个键值对
}
return {};
}
};