官解1:由于输入数组是有序的,因此考虑二分查找
依次循环i,在i之后的元素中寻找j,如果可以找到就返回,找不到继续循环。
java
class Solution {
public int[] twoSum(int[] numbers, int target) {
int len = numbers.length;
for(int i=0;i<len;i++){
int j = target - numbers[i];
int left = i+1;
int right = len - 1;
while(left <= right){
int mid = left + (right - left)/2;
if(numbers[mid] == j){
return new int[]{i+1, mid+1};
}else if(numbers[mid] < j){
left = mid + 1;
}else{
right = mid - 1;
}
}
}
return new int[]{-1,-1};
}
}
管解2: 官解
使用左右两个指针
- 当两数之和等于目标是,说明找到了,返回
- 当大于目标时,说明大了,使较大的数(右侧的数)-1
- 当小于目标时,说明小了,使较小的数(左侧的数)+1
java
class Solution {
public int[] twoSum(int[] numbers, int target) {
int start = 0;
int end = numbers.length -1;
while(start < end){
if(numbers[start] + numbers[end] == target){
return new int[]{start+1, end+1};
}else if(numbers[start] + numbers[end] > target){
end--;
}else{
start++;
}
}
return new int[]{-1,-1};
}
}