Difficulty: Easy
暴力解法肯定不行。
注意到两点:
- 最后要返回在原始数组中的位置
- 数字可以有重复,所以不可以简单用 map 或 set 全装进去
Solution 1:
先排序,然后转化为双指针,找到两个数字之后,再在原来的数组中找到它们的位置。复杂度O(nlogn)。
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
auto nums0 = nums;
sort(nums.begin(), nums.end());
int i = 0, j = nums.size() - 1;
while (i < j) {
int sum = nums[i] + nums[j];
if (sum < target)
i++;
else if (sum > target)
j--;
else
break;
}
for (int k = 0; k < nums0.size(); k++)
if (nums0[k] == nums[i]) {
i = k;
break;
}
for (int k = nums0.size() - 1; k >= 0; k--)
if (nums0[k] == nums[j]) {
j = k;
break;
}
return {i, j};
}
};
* Solution 2:
渐进地将数字装入map中,可以避免重复数字的出现。同时使用map记录数字在原数组中的位置。
class Solution {
public:
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> m;
for (int i = 0; i < nums.size(); i++) {
if (m.count(target - nums[i]) == 0) {
m.insert({nums[i], i});
} else {
return {i, m[target - nums[i]]};
}
}
return {0, 0};
}
};