【双指针】167. 两数之和 II - 输入有序数组
二分法O(nlogn)
class Solution {
public:
int bSearch(vector<int>& numbers, int left, int right, int target){
// 左闭右开 找左侧边界
while(left < right){
int mid = (left + right) / 2;
if(numbers[mid] < target){
left = mid + 1;
}
else{
right = mid;
}
}
if (left == numbers.size()) return -1;
return (numbers[left] == target)? left : -1;
}
vector<int> twoSum(vector<int>& numbers, int target) {
for (int i=0; i<numbers.size(); ++i){
int flag = bSearch(numbers, i+1, numbers.size(), target - numbers[i]);
if (flag != -1)
return vector<int>{i+1, flag+1};
}
return vector<int>();
}
};
双指针 O(n)
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int left = 0;
int right = numbers.size() - 1;
while (left < right){
if(numbers[left] + numbers[right] == target)
return {left+1,right+1};
else if(numbers[left] + numbers[right] < target)
left += 1;
else
right -= 1;
}
return vector<int>();
}
};

浙公网安备 33010602011771号