问题描述:
解决方案:
第一次尝试:双指针
本来我想的是在有序数组上查找2个数字,比较方便,然后我就想从小到大排序。
然后运用双指针p和q,一个在头,一个在尾,这样的话,时间复杂度为
O
(
n
)
O(n)
O(n)。
- 如果p+q >target ,q左移
- 如果p+q<target,p右移
- 如果p+q=target,就是我们要找的数字了
但是,最后题目要输出的是原来数组中的下标,不是排序后的下标,也不是p和q所指的数字。
于是这个方法不行!继续想
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
//先将数组从小到大排列
sort(nums.begin(),nums.end());
int p=0,q=nums.size()-1;
vector<int>res;
while(p!=q){
if(nums[p]+nums[q]>target){
q--;
}
else if(nums[p]+nums[q]<target){
p++;
}
else{
res.push_back(p);
res.push_back(q);
return res;
}
}
return res;
}
};
第二次:使用unordered_map
这里先详细介绍一下unordered_map:
- 首先,unordered_map容器是无序的。底层原理是hash table
- 以键值对(pair类型)的形式存储数据,存储的各个键值对的键 互不相同且不允许被修改
- **find() 函数:**查找以key为键的键值对,如果找到返回一个指向该键值对的正向迭代器。如果没有找到,指向容器最后一个键值对之后位置的迭代器(就是调用end()函数)
- end()函数,返回指向容器一个键值对之后位置的正向迭代器
- insert()函数:向容器添加新的键值对。对一个map进行操作时,必须记住元素类型是pair. 通常对于想要插入的数据如果没有现成的pair对象,可以创建一个pair对象。
可以这么写:
1. map.insert({word,1}) //用花括号初始化
2. map.insert(make_pair(word,1)) //调用make_pair
3. map.insert(pair<string,int>(word,1))//显式的构造pair
4. map.insert(map<string,int>:value_type(word,1))//调用参数
最后的代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int,int>map;
for(int i=0;i<nums.size();i++){
map.insert(pair<int,int>(nums[i],i));
auto iter=map.find(target-nums[i]);
if(iter!=map.end() && iter->second!=i){
return {iter->second,i};
}
}
return {};
}
};
时间复杂度很显然是 O ( n ) O(n) O(n)