问题
思路
朴素的思路就是两层循环。但是TLE.
代码(TLE)
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int sz = numbers.size();
std::vector<int> ret;
for( int i = 0; i < sz - 1; ++i ){
for( int j = i + 1; j < sz; ++j ){
if( numbers[i] + numbers[j] == target )
{
ret.push_back(i+1);
ret.push_back(j+1);
return ret;
}
}
}
return ret;
}
};
思路1
看见有序序列,敏感一点就能想到二分查找。这么做复杂度就是O(nlogn).
代码1
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int sz = numbers.size();
vector<int> ret;
if(!sz) return ret;
for( int i = 0; i < sz - 1; ++i ){
int key = target - numbers[i];
int j = biSearch( numbers, i + 1, sz - 1, key );
if(-1 == j)
continue;
ret.push_back(i+1);
ret.push_back(j+1);
return ret;
}
return ret;
}
private:
int biSearch( const vector<int>& arr, int low, int high, int key ){
while(low <= high){
int mid = (low+high)/2;
if(arr[mid] == key)
return mid;
else if( key < arr[mid] )
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
};