两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
我的思路:
直接用两个迭代器遍历,一个固定,一个向前找。如果前后两个相加为目标的话,就把两个迭代器的值放入ans数组中(题目要求返回的时数组的下标),然后在nums数组中删除这两个元素(因为不能重复利用数组中的元素),固定的迭代器直接根据擦除数据时返回的下一个迭代器作为自加的操作,而用来寻找的迭代器只要每次都从固定的迭代器的后一位置开始。执行完操作后直接break跳出循环。如果没找到符合条件的值,就使固定迭代器自加,实现向后一位。
运行不成功 ,提示超时,但也没有显示结果,应该是内部有什么问题而我看不出来。
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>ans;
vector<int>::iterator it1,it2,it3;
for(it1=nums.begin();it1<nums.end()-1; ){
for(it2=it1+1;it2<nums.end(); ){
if(*it1+*it2==target){
ans.push_back(*it1);
ans.push_back(*it2);
it1=nums.erase(it1);
it3=nums.erase(it2);
break;
}
else{
++it2;
}
}
}
return ans;
}
};
看了题解的暴力解法后自己写的代码,已通过:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>ans;
for(int i=0;i<nums.size();++i){
for(int j=i+1;j<nums.size();++j){
if(nums[j]==target-nums[i]){
ans.push_back(i);
ans.push_back(j);
}
else{
continue;
}
}
}
return ans;
}
};
但是有一点不明白,不是说不能重复利用元素吗?我认为应该在获得完一次下标后,把对应元素置零,以防重发利用.
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int>ans;
for(int i=0;i<nums.size();++i){
for(int j=i+1;j<nums.size();++j){
if(nums[j]==target-nums[i]){
ans.push_back(i);
ans.push_back(j);
nums[i]=0;
nums[j]=0;
}
else{
continue;
}
}
}
return ans;
}
};
用我自己测试用例,即有重复元素出现时,不置零的话得到的结果不正确,置零的结果可以得到多组,要更好一点。
更优化的写法要用到哈希表、map等,等我学会了再说。
拜拜
胖虎加油