167. The sum of two numbers Ⅱ-input ordered array

Double pointer + a little optimization:

class Solution {
    
    
    public int[] twoSum(int[] numbers, int target) {
    
    
        int left=0;
        int right=numbers.length-1;
        while(left<=right){
    
    
            int mediate=left+(right-left)/2;
            if(numbers[left]+numbers[right]==target) return new int[] {
    
    left+1,right+1};
            else if(numbers[left]+numbers[right]<target){
    
    
                if(numbers[mediate]+numbers[right]<target) left=mediate+1;
                else if(numbers[mediate]+numbers[right]>target) left=left+1;
                else return new int[] {
    
    mediate+1,right+1};
            }
            else if(numbers[left]+numbers[right]>target){
    
    
                if(numbers[mediate]+numbers[left]>target) right=mediate-1;
                else if(numbers[mediate]+numbers[left]<target)  right=right-1;
                else return new int[] {
    
    left+1,mediate+1};
            }
        }
        return null;
    }
  
}

Saw a very clever way of writing, you can use the dichotomy to determine the right range, and then use the double pointer to determine the final result.


class Solution {
    
    
    public int[] twoSum(int[] numbers, int target) {
    
    
        if(numbers==null) return null;
        int tail=Dichotomy(numbers,target-numbers[0]);
        int head=0;
        while(head<tail){
    
    
              int sum=numbers[head]+numbers[tail];
              if(sum==target) return new int[]{
    
    head+1,tail+1};
              else if(sum<target) head++;
              else tail--;  
        }
        return null;
    }

    private int Dichotomy(int[] numbers,int target){
    
    //找到了最接近目标值的下标
        int left=0;
        int right=numbers.length-1;
        while(left<=right){
    
    
            int mediate=left+(right-left)/2;
            if(numbers[mediate]==target) return mediate;
            else if(numbers[mediate]>target) right=mediate-1;
            else left=mediate+1;
        }
        return left-1;//即返回的num[left-1]<target
    }
}

If nums[i]>target-nums[0]so, then nums[i] and the right side are definitely not what you want.
We need nums[i]<=target-nums[0]. And Dichotomy solves this problem.

I also understand that since the priority of + is higher than >>, the 8+(10)>>1result is 9, not 13.

Guess you like

Origin blog.csdn.net/qq_43179428/article/details/106836689