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

LeetCode每日一题,167. Two Sum II - Input array is sorted

先看题目描述

大意就是给定一个有序数组和一个目标整数 target,返回其中相加等于 target 的两个数的下标(下标从 1 开始)

算法和思路

方法一:二分查找

因为题目给定的是个有序数组,所以第一反应就是用二分法,思路就是先固定一个数字,然后去寻找第二个数字,第二个数字的值等于 target - 固定的数字,利用数组的有序性,可以用二分查找法来寻找第二个数字,每次只在固定的数字右侧进行二分查找

实现源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] res = new int[2];
for (int i = 0; i < numbers.length; i++) {
int tar = target - numbers[i];
int left = i + 1;
int right = numbers.length - 1;
while(left <= right) {
int mid = left + (right - left) / 2;
if (numbers[mid] < tar) {
left = mid + 1;
} else if (numbers[mid] > tar) {
right = mid - 1;
} else {
res[0] = i + 1;
res[1] = mid + 1;
return res;
}
}
}
return res;
}
}

方法二:双指针法

定义一个 left 指针与一个 right 指针,初值为 0 与 numbers.length - 1,当 nums[left] + nums[right] < target 时,left 指针右移一位,当 nums[left] + nums[right] > target 时,right 指针左移一位,重复上述过程直至 nums[left] + nums[right] = target,并将结果返回

实现源码如下

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public int[] twoSum(int[] numbers, int target) {
int left = 0;
int right = numbers.length - 1;
while (left <= right) {
if (numbers[right] + numbers[left] > target) right--;
else if (numbers[right] + numbers[left] < target) left++;
else return new int[]{left + 1, right + 1};
}
return new int[]{0, 0};
}
}