LeetCode 1.两数之和
https://leetcode-cn.com/problems/two-sum/
1 暴力枚举
不管怎样,先把最简单的暴力枚举给安排上。因为题目假定每种输入只会对应一个答案,所以只要搜索到和为target的两个数即可返回它们的下标。
class Solution {
public:
// 时间和空间复杂度:O(N^2), O(N)
vector<int> twoSum(vector<int>& nums, int target) {
int sz = nums.size();
for (int i = 0; i < sz; ++i) {
for (int j = i + 1; j < sz; ++j) {
if (nums[i] + nums[j] == target) {
return vector<int>{i, j};
}
}
}
return vector<int>{-1, -1};
}
};
2 两遍哈希
使用哈希?如果数组中有重复元素怎么办?假如数组为[2, 2, 7, 11]
,target值为9
。由于重复元素的存在,导致有两种答案的出现,不符合题意。所以,要么是数组中不存在重复元素,要么是数组中存在重复元素,但是数组中没有其他数和该重复元素之和为target导致出现两种答案。比如还是上面这个数组,但是target值为18
。
class Solution {
public:
// 时间和空间复杂度:O(N), O(N)
vector<int> twoSum(vector<int>& nums, int target) {
int sz = nums.size();
unordered_map<int, int> dict; // <nums[i], i>
for (int i = 0; i < sz; ++i) {
dict.insert(make_pair(nums[i], i));
}
for (int i = 0; i < sz; ++i) {
auto iter = dict.find(target - nums[i]);
if (iter != dict.end() && iter->second != i)
return vector<int>{i, iter->second};
}
return vector<int>{-1, -1};
}
};
3 一遍哈希
其实没必要扫描两遍,如果两个数之和为target,则当枚举到后一个数时,前一个数肯定已经在哈希表中了。
class Solution {
public:
// 时间和空间复杂度:O(N), O(N)
vector<int> twoSum(vector<int>& nums, int target) {
int sz = nums.size();
unordered_map<int, int> dict; // <nums[i], i>
for (int i = 0; i < sz; ++i) {
auto iter = dict.find(target - nums[i]);
if (iter != dict.end() && iter->second != i)
return vector<int>{iter->second, i};
dict.insert(make_pair(nums[i], i));
}
return vector<int>{-1, -1};
}
}