【leetcode】5. 数组-两数之和

题目

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
难易程度:easy

示例:

给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

题解

分析

本题比较简单,可以简单转换一下,有元素nums[i], 数组nums是否存在target - nums[i],即转换成一个查找问题:

  1. 如果原地查找,不开辟额外空间的话,查找一个元素最好的情况是O(log(n)),这还是数组有序的情况下,显然本题数组不是有序;
  2. 可以定义一个map,查找时间复杂度是O(1)
    因此,本题,可以这么做:
  3. 遍历数组nums,创建map,diff[nums[i]] = i
  4. 再次遍历nums,检查diff[target-nums[i]]是否存在,如果存在即满足需求

注意,上述方法需要遍历两次数组nums,其实,可以只遍历一次,边遍历边检查。代码如下
时间复杂度:O(N)
空间复杂度:O(N)

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int size = nums.size();
vector<int> ret;
std::map<int, int> diff;
for (int i = 0; i < size; i++) {
int sub = target - nums[i];
if (diff.count(sub) > 0) {
ret.push_back(diff[sub]);
ret.push_back(i);
} else {
diff[nums[i]] = i;
}
}
return ret;
}
};