leetcode刷题——两数之和ll-输入有序数组

1.题目

leetcode刷题——两数之和ll-输入有序数组_第1张图片

2.思路

numbers 按非递减顺序排列
仅存在一个有效答案
numbers 的下标 从1开始计数
nums[i]=numbers[i]-target
数组有序可利用二分法查找使num[i]==numbers[j]的j,然后将i,j保存至sum数组

3.提交记录

第一次提交

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int len = numbers.length;
        int nums[] = new int[len];
        int sum[] = new int[2];
        for(int i=0;i<len;i++){
            nums[i]=target-numbers[i];//降序数组
        }
        for(int i=0;i<len;i++){
            //按二分法在numbers数组中查找nums[i];
            int left = 0;
            int right = len-1;
            while(left<=right){
                int mid = left+(right-left)/2;
                if(numbers[mid]==nums[i]&&mid!=i){
                    if(mid>i){
                        sum[0]=i+1;
                        sum[1]=mid+1;
                    }else{
                        sum[1]=i+1;
                        sum[0]=mid+1;
                    }
                    return sum;
                }else if(numbers[mid]>nums[i]){
                    //查找值在右边
                    left = mid+1;
                }else{
                    right = mid-1;
                }
            }
        }
        return sum;
    }

leetcode刷题——两数之和ll-输入有序数组_第2张图片
分析:二分法对于降序数组与升序数组的处理有一定的区别,nums是降序数组,而numbers是升序数组,本题是在升序数组numbers中二分查找目标值nums[i],i是循环变量。
第二次提交

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int len = numbers.length;
        int nums[] = new int[len];
        int sum[] = new int[2];
        for(int i=0;i<len;i++){
            nums[i]=target-numbers[i];//降序数组
        }
        for(int i=0;i<len;i++){
            //按二分法在numbers数组中查找nums[i];
            int left = 0;
            int right = len-1;
            while(left<=right){
                int mid = left+(right-left)/2;
                if(numbers[mid]==nums[i]&&mid!=i){
                    if(mid>i){
                        sum[0]=i+1;
                        sum[1]=mid+1;
                    }else{
                        sum[1]=i+1;
                        sum[0]=mid+1;
                    }
                    return sum;
                }else if(numbers[mid]>nums[i]){
                    //查找值在左边
                    right = mid-1;
                }else{
                    left = mid+1;
                }
            }
        }
        return sum;
    }
}

leetcode刷题——两数之和ll-输入有序数组_第3张图片

4.官方题解

双指针
leetcode刷题——两数之和ll-输入有序数组_第4张图片

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int low = 0, high = numbers.length - 1;
        while (low < high) {
            int sum = numbers[low] + numbers[high];
            if (sum == target) {
                return new int[]{low + 1, high + 1};
            } else if (sum < target) {
                ++low;
            } else {
                --high;
            }
        }
        return new int[]{-1, -1};
    }
}

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)