给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
第一遍。
直接两个for循环
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int i,j;
for(i=0;i<nums.size()-1;i++)
{
for(j=i+1;j<nums.size();j++)
{
if(nums[i]+nums[j] == target)
return {i,j};
}
}
return {i,j};
}
};
喜提268ms
第二遍
看了一下官方的哈希表,学习了一下
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int ,int> hashtable;
for(int i = 0;i < nums.size();++i){
auto iter = hashtable.find(target - nums[i]);
if(iter != hashtable.end()){
return{iter->second,i};
}
hashtable[nums[i]] = i;
}
return{};
}
};
第一次写这种,属于是一窍不通,磕磕碰碰算是能理解然后独立写出来了。
比起双for,哈希表的时间从O(n2)降到O(n),只遍历了一次nums
哈希表存在键和值,hashtable->first是键,hashtable->second是值
成功到了8ms
第三遍
后来官方思路自己再写了一次
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int ,int> hashtable(nums.size());
vector<int> result;
result.reserve(2);
for(auto it = nums.begin(); it != nums.end();++it){
auto iter = hashtable.find(target - *it);
if(iter != hashtable.end()){
result.push_back(iter->second);
result.push_back(it - nums.begin());
return result;
}
hashtable[*it] = it - nums.begin();
}
return result;
}
};
提前定义了返回值,减少内存分配占用
*it-nums.begin()是迭代器之间的距离
it-nums.begin()是迭代器的值相减