LeetCode167——两数之和 II - 输入有序数组
我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/description/
题目描述:
知识点:双指针、二分查找法
思路一:双指针
一左一右双指针逐渐逼近查找。
时间复杂度是O(n),其中n为数组中的元素个数。空间复杂度是O(1)。
JAVA代码:
public class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] indexes = new int[2];
int i = 0;
int j = numbers.length - 1;
while(i < j) {
if(numbers[i] + numbers[j] == target) {
indexes[0] = i + 1;
indexes[1] = j + 1;
break;
}else if(numbers[i] + numbers[j] < target) {
i++;
}else {
j--;
}
}
return indexes;
}
}
LeetCode解题报告:
思路二:二分查找法
对numbers数组中的每一个元素都使用二分查找法在该元素右边查找第二个元素。
时间复杂度是O(nlogn),其中n为数组中的元素个数。空间复杂度是O(logn)。
JAVA代码:
public class Solution {
public int[] twoSum(int[] numbers, int target) {
int[] indexes = new int[2];
for (int i = 0; i < numbers.length; i++) {
int temp = target - numbers[i];
int index = find(numbers, i + 1, numbers.length - 1, temp);
if(index != -1) {
indexes[0] = i + 1;
indexes[1] = index + 1;
}
}
return indexes;
}
private int find(int[] arr, int left, int right, int temp) {
if(left > right) {
return -1;
}
int mid = left + (right - left) / 2;
if(arr[mid] == temp) {
return mid;
}else if(arr[mid] > temp) {
return find(arr, left, mid - 1, temp);
}else {
return find(arr, mid + 1, right, temp);
}
}
}
LeetCode解题报告: