leetcode 167. 两数之和 II - 输入有序数组

218 阅读2分钟

题目描述

给定一个已按照 非递减顺序排列  的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length 。

你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。

  示例 1:

输入:numbers = [2,7,11,15], target = 9
输出:[1,2]
解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2

示例 2:

输入:numbers = [2,3,4], target = 6
输出:[1,3]

示例 3:

输入:numbers = [-1,0], target = -1
输出:[1,2]

题解

1.双循环

public int[] twoSum(int[] numbers, int target) {
        // 一个指针从左边开始,每移动一次,右指针从数组尾部移动到左指针的位置
        int left = 0;
        int right = 0;
        int leftValue = 0;
        int rightValue = 0;
        // 标志找到
        int flag = 0;
        // 左指针启动
        while (left < numbers.length -1) {
            leftValue = numbers[left];
            right = numbers.length -1;
            // 右指针遍历剩余元素 ,并且进行判断
            while (right > left) {
                rightValue = numbers[right];
                if (leftValue + rightValue == target) {
                    flag = 1;
                    break;
                }
                right --;
            }

            if (flag ==1) {
                break;
            }
            left ++;
        }
        int[] result = {left+1,right+1};
        return result;
    }

image.png

2.使用双指针比较缩进

多使用两个临时指针用于代替小循环,在大循环执行一圈时,小循环使用temp的两个指针代替

1.两个临时指针起始位置为左右指针.临时指针相加与目标值进行比较.由于是顺序排列,如果比目标值大,那么右临时指针向左走一步,如果比目标值大,左临时指针向右走一步. 2.当两个临时指针碰到,说明这次循环没有找到.那么左右指针向内各进一步,两个临时指针等于左右指针

  • 当小于时,左指针向后进一步.
  • 当大于时,右指针向前退一步.
  • 当两者相遇时,相当于结束小循环.指针都向前一步.

注意点:临时指针赋值需要在小循环相遇的时候再进行计算.放在外面会对每次循环产生影响.

public static int[] twoSum(int[] numbers, int target) {
        // 一个指针从左边开始,每移动一次,右指针从数组尾部移动到左指针的位置
        int left = 0;
        int right = numbers.length -1;
        int leftValue = 0;
        int rightValue = 0;
        int leftTemp = 0;
        int rightTemp = right;
        while (left < right) {
            leftValue = numbers[leftTemp];
            rightValue = numbers[rightTemp];
            if (leftValue + rightValue < target) {
                leftTemp ++;
            }else if (leftValue + rightValue > target) {
                rightTemp --;
            }else
                break;
            // 指针相遇,跳过这次
            if (leftTemp == rightTemp) {
                left ++;
                right --;
                leftTemp = left;
                rightTemp = right;
            }
        }
        int[] result = {leftTemp+1,rightTemp+1};
        return result;
    }

image.png