LeetCode-Q167-两数之和II

Q167.两数之和II

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

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • $2 <= numbers.length <= 3 * 10^4$
  • $-1000 <= numbers[i] <= 1000$
  • numbers 按 非递减顺序 排列
  • $-1000 <= target <= 1000$
  • 仅存在一个有效答案

思路

  1. 通过左右指针的方式遍历数组。同样是一趟遍历返回数字组合
  2. 返回时的索引要+1,因为题目中下标是从1开始。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Solution1 implements TwoSumSolution {
public int[] twoSum(int[] nums, int target) {
int left= 0;
int right = nums.length-1;
while(left<right){ // 终止条件
if(nums[left] + nums[right]> target){
right--;
}else if(nums[left] + nums[right]< target) {
left++;
}else{
if (nums[left] + nums[right] == target) {
return new int[]{left+1, right+1};
}
}
}
return new int[]{};
}
}