一、最直接的方法,直接是两层循环,这也是效率最低的方法。O(n^2) 战胜0.3%
class Solution {
/**** 遍历里面的数字,双重循环
* 不能排序,排序后就不能保持原来的index了
*
******/
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> ret;
//sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
//if(nums[i]>target) break;
for(int j=i+1;j<nums.size();j++){
if(nums[i]+nums[j]==target){
ret.push_back(i);
ret.push_back(j);
break;
}
}
}
return ret;
}
};
二、寻找高效方法
使用排序就会减少循环的次数,排序是O(nlogn),如何记录index?查查资料 战胜85%
解决两个问题:1.排序后如何操作?
使用双指针,一个在头一个在尾,通过与target的比较,来移动两个指针。这样只需一次遍历O(n)。
就是一个从前向后移动,一个从后向前移动。
int i=0;int j=nums.size()-1; 即可。
2.找到原来数组中的位置?
把两个数,输入到原来的数组,找出位置。
一个for()循环,值得注意的是,找到两个数后,就可以跳出循环了。
class Solution {
/***
* 遍历里面的数字,双重循环
* 不能排序,排序后就不能保持原来的index了
*
******/
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> saveNums(nums);
vector<int> ret;
sort(nums.begin(),nums.end());
int l=0;int r=nums.size()-1;
while(r>l){
if(nums[l]+nums[r]>target) r--;
else if(nums[l]+nums[r]<target) l++;
else if(nums[l]+nums[r]==target){
// ret.push_back(nums[l]);
///ret.push_back(nums[r]);
break;
}
}
//找出来 ret中的数在saveNum中的位置
for(int i=0;i<nums.size();i++){
if(nums[l]==saveNums[i]||nums[r]==saveNums[i]){
ret.push_back(i);
// break;
}
if(ret.size()>1)break;
}
return ret;
}
};
这个题目:默认情况是,没有重复的数。最终结果只会是两个数或者没有数。