题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2
<
=
n
u
m
s
.
l
e
n
g
t
h
<
=
1
0
4
2 <= nums.length <= 10^4
2<=nums.length<=104
−
1
0
9
<
=
n
u
m
s
[
i
]
<
=
1
0
9
-10^9 <= nums[i] <= 10^9
−109<=nums[i]<=109
−
1
0
9
<
=
t
a
r
g
e
t
<
=
1
0
9
-10^9 <= target <= 10^9
−109<=target<=109
只会存在一个有效答案
1 直接暴力求解
分析:问题规模 1 0 4 10^4 104 ,两层循环,问题不大,所以直接暴力求解
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> a;
for(int i = 0;i < nums.size(); i++){
for(int j = i+1; j < nums.size(); j++){
if(nums[i] + nums[j] == target){
a.push_back(i);
a.push_back(j);
return a;
}
}
}
return a;
}
但是不出所料,结果不太好,算法效率不高。
2 使用 map 求解
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> map;
vector<int> result;
for (int i = 0; i < nums.size(); i++) {
map[nums[i]] = i;
}
for (int i = 0; i < nums.size(); i++) {
int k = target - nums[i];
if (map.find(k) != map.end() && map[k] != i) {
result.push_back(i);
result.push_back(map[k]);
return result;
}
}
return result;
}
时间约为1/10,空间复杂度略高。
3 些许改进
vector<int> twoSum(vector<int> &nums, int target) {
unordered_map<int, int> map;
vector<int> result;
for (int i = 0; i < nums.size(); i++) {
int k = target - nums[i];
if (map.find(k) != map.end()) {
result.push_back(i);
result.push_back(map[k]);
return result;
}
map[nums[i]] = i;
}
return result;
}
From today onwards, let’s stop internal friction.