Leetcode001-Two Sun
求数组中相加为定和的两数的位置
问题描述: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.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
第一次尝试
首先想到的是遍历一遍数组,每次在剩余部分查找等于sum-current的位置,尝试了一下,超时了。Time Limit Exceeded
vector<int> twoSum(vector<int>& nums, int target) {
int length = nums.size();
vector<int> indice;
for(int i=0;i<length;i++){
int add1 = nums[i];
vector<int>::iterator indice_2 = find(nums.begin(),nums.end(),target-add1);
// 查找的元素是add1本身
if (indice_2 == nums.begin()+i)
continue;
if (indice_2>=nums.begin()&&indice_2<nums.end()){
indice.push_back(i);
// cout<<nums[i];
indice.push_back(indice_2-nums.begin());
// cout<<nums[indice_2-nums.begin()];
break;
}
}
return indice;
}
第二次尝试
尝试使用STL map,map牺牲空间使得查询速度更快。第一次尝试,报错 attempt to dereference a past-and-end iterator
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> temp;
vector<int> indice;
int length = nums.size();
for (int i = 0; i<length; i++){
temp[nums[i]] = i;
}
for(int i = 0; i<length; i++){
int add1 = nums[i];
int indice_2 = 0;
map<int,int>::iterator it = temp.find(target-add1);
indice_2 = it->second;
if (indice_2 < length && indice_2 != i && indice_2>0){
indice.push_back(i);
// cout<<i<<" "<<nums[i]<<endl;
indice.push_back(indice_2);
// cout<<indice_2<<" "<<nums[indice_2]<<endl;
break;
}
}
return indice;
}
这里不得不说,我国的 度娘 和 Google 还是有相当的差距,查了半天,总算理解了,是说可能引用了end()迭代器,不太好,于是。。。修改如下:
AC版本
vector<int> twoSum(vector<int>& nums, int target) {
map<int,int> temp;
vector<int> indice;
int length = nums.size();
for (int i = 0; i<length; i++){
temp[nums[i]] = i;
}
for(int i = 0; i<length; i++){
int add1 = nums[i];
int indice_2 = 0;
// map<int,int>::iterator it = temp.find(target-add1);
// indice_2 = it->second;
map<int,int>::iterator it = temp.find(target-add1);
if(it != temp.end())
indice_2 = it->second;
if (indice_2 < length && indice_2 != i && indice_2>0){
indice.push_back(i);
cout<<i<<" "<<nums[i]<<endl;
indice.push_back(indice_2);
cout<<indice_2<<" "<<nums[indice_2]<<endl;
break;
}
}
return indice;
}