两数之和 II - 输入有序数组

题目

力扣

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1]numbers[index2] ,则 1 <= index1 < index2 <= numbers.length

以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1index2

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

你所设计的解决方案必须只使用常量级的额外空间。

示例

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

题解

使用双指针,一个指针指向值较小的元素,一个指针指向值较大的元素。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。

  • 如果两个指针指向元素的和 sum == target,那么得到要求的结果;
  • 如果 sum > target,移动较大的元素,使 sum 变小一些;
  • 如果 sum < target,移动较小的元素,使 sum 变大一些。

数组中的元素最多遍历一次,时间复杂度为 O(N)。只使用了两个额外变量,空间复杂度为 O(1)。

img

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class TwoSum {
public static void main(String[] args) {
int[] numbers = {2,7,11,15};
int target = 9;
int[] ints = twoSum(numbers, target);
for (int anInt : ints) {
System.out.println(anInt);
}
}

public static int[] twoSum(int[] numbers, int target){
//数组不为空
if (numbers == null){
return null;
}
//左指针
int i = 0;
//右指针,数组长度-1
int j = numbers.length - 1;
while (i < j){
int sum = numbers[i] + numbers[j];
if (sum == target){
//如果相等返回坐标
return new int[]{i+1,j+1};
}else if (sum < target){
//如果和<目标,左指针增加
i++;
}else {
//右指针增加
j--;
}
}
return null;
}
}

两数之和 II - 输入有序数组
https://tomysmith.top/two-sum/
作者
Plua Htims
发布于
2023年11月25日
许可协议