【双指针】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>();
    }
};
posted @ 2022-02-28 20:02  fwx  阅读(25)  评论(0)    收藏  举报