【leetcode】1. Two Sum

题目

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution, and you may not use the same element twice.

Example:

Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].

分析

给一个数组和一个整数,返回数组中和恰好等于这个整数的两个数组的位置

自己就只想出来了从前向后遍历的方法,时间复杂度$O(n^2)$

代码如下

代码

class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
hash_map<int,int> map;
for(int i = 0;i < nums.size();i++){
int res = target-nums[i];
if (map.)
for(int j = i+1;j < nums.size();j++){
if (res == nums[j]){
result.push_back(i);
result.push_back(j);
return result;
}
}
}
}
};

改进

看了solution才知道这道题正确的打开方式是用hash_map,可以先把数组中的元素存入hash_map中,这样就可以实现O(1)复杂度的按值查找了。

不过还有更好的方式,就是采用边查找边插入的方式,代码如下:

vector<int> twoSum(vector<int> a,int b) {
vector<int> res;
unordered_map<int, int> map;
for (int i = 0; i < a.size(); i++) {
int temp = b - a[i];
//查看map里是否已经有要找的元素
unordered_map<int, int>::iterator it = map.find(temp);
//如果没有,把当前元素的值和idx插入map
if (it == map.end()) {
map.insert(make_pair(a[i], i));
}
//找到了符合要求的,返回idx
else{
res.push_back(it->second);
res.push_back(i);
}
}
return res;
}

这样在查找指定值元素的时候就可以有$O(1)$的复杂度了,遍历的复杂度是$O(n)$,总的复杂度是$O(n)$

结果