P11-两数之和-有序数组-二分法/双指针算法

//两数之和-有序数组
/*
 * 给定一个升序排列的整数数组,从数组中找出两个数满足相加之和等于目标数target
 * 假设每个输入只对应唯一的答案,而且不可以重复使用相同的元素。
 * 返回两数的下标值,以数组形式返回
 * */
public class P11 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(point(new int[]{1, 2, 3, 4, 5, 6}, 10)));
    }

    //二分法
    //先假定一个数解,然后找另一个解在不在数组中
    public static int[] search(int[] numbers, int target){
        for (int i=0; i<numbers.length; i++){
            int low = i;
            int high = numbers.length - 1;
            while(low <= high){
                int mid = (high + low) / 2;
                if(numbers[mid] == target - numbers[i]){
                    return new int[]{i, mid};
                }else if(numbers[mid] > target - numbers[i]){
                    high = mid - 1;
                }else{
                    low = mid + 1;
                }
            }
        }
        return new int[0];
    }

    //双指针--更优解
    //一个指针在首,一个指针在尾,如果 left+right > target,让right左移,
    //left+right < target,left右移
    public static int[] point(int[] numbers, int target){

        int low = 0;
        int high = numbers.length - 1;

        while(low < high){
            int sum = numbers[low] + numbers[high];
            if(sum == target){
                return new int[]{low, high};
            }else if(sum > target){
                high--;
            }else{
                low++;
            }
        }

        return new int[0];
    }
}

 

posted @ 2022-04-11 11:20  YonchanLew  阅读(37)  评论(0)    收藏  举报