numbers 按非递减顺序排列
仅存在一个有效答案
numbers 的下标 从1开始计数
nums[i]=numbers[i]-target
数组有序可利用二分法查找使num[i]==numbers[j]的j,然后将i,j保存至sum数组
第一次提交
class Solution {
public int[] twoSum(int[] numbers, int target) {
int len = numbers.length;
int nums[] = new int[len];
int sum[] = new int[2];
for(int i=0;i<len;i++){
nums[i]=target-numbers[i];//降序数组
}
for(int i=0;i<len;i++){
//按二分法在numbers数组中查找nums[i];
int left = 0;
int right = len-1;
while(left<=right){
int mid = left+(right-left)/2;
if(numbers[mid]==nums[i]&&mid!=i){
if(mid>i){
sum[0]=i+1;
sum[1]=mid+1;
}else{
sum[1]=i+1;
sum[0]=mid+1;
}
return sum;
}else if(numbers[mid]>nums[i]){
//查找值在右边
left = mid+1;
}else{
right = mid-1;
}
}
}
return sum;
}
分析:二分法对于降序数组与升序数组的处理有一定的区别,nums是降序数组,而numbers是升序数组,本题是在升序数组numbers中二分查找目标值nums[i],i是循环变量。
第二次提交
class Solution {
public int[] twoSum(int[] numbers, int target) {
int len = numbers.length;
int nums[] = new int[len];
int sum[] = new int[2];
for(int i=0;i<len;i++){
nums[i]=target-numbers[i];//降序数组
}
for(int i=0;i<len;i++){
//按二分法在numbers数组中查找nums[i];
int left = 0;
int right = len-1;
while(left<=right){
int mid = left+(right-left)/2;
if(numbers[mid]==nums[i]&&mid!=i){
if(mid>i){
sum[0]=i+1;
sum[1]=mid+1;
}else{
sum[1]=i+1;
sum[0]=mid+1;
}
return sum;
}else if(numbers[mid]>nums[i]){
//查找值在左边
right = mid-1;
}else{
left = mid+1;
}
}
}
return sum;
}
}
class Solution {
public int[] twoSum(int[] numbers, int target) {
int low = 0, high = numbers.length - 1;
while (low < high) {
int sum = numbers[low] + numbers[high];
if (sum == target) {
return new int[]{low + 1, high + 1};
} else if (sum < target) {
++low;
} else {
--high;
}
}
return new int[]{-1, -1};
}
}