二分查找
class Solution {
public int [ ] twoSum ( int [ ] numbers, int target) {
for ( int i = 0 ; i < numbers. length; ++ i) {
int low = i + 1 , high = numbers. length - 1 ;
while ( low <= high) {
int mid = ( high - low) / 2 + low;
if ( numbers[ mid] == target - numbers[ i] ) {
return new int [ ] { i + 1 , mid + 1 } ;
} else if ( numbers[ mid] > target - numbers[ i] ) {
high = mid - 1 ;
} else {
low = mid + 1 ;
}
}
}
return new int [ ] { - 1 , - 1 } ;
}
}
public int [ ] twoSum ( int [ ] nums, int target) {
if ( nums == null || nums. length == 0 ) return new int [ 0 ] ;
for ( int i = 0 ; i < nums. length; i++ ) {
int x = nums[ i] ;
int index = binarySearch ( nums, i + 1 , nums. length - 1 , target - x) ;
if ( index != - 1 ) {
return new int [ ] { i + 1 , index + 1 } ;
}
}
return new int [ 0 ] ;
}
private int binarySearch ( int [ ] nums, int left, int right, int target) {
while ( left <= right) {
int mid = left + ( right - left) / 2 ;
if ( nums[ mid] == target)
return mid;
if ( nums[ mid] > target)
right = mid - 1 ;
else
left = mid + 1 ;
}
return - 1 ;
}
双指针
public int [ ] twoSum ( int [ ] nums, int target) {
if ( nums == null || nums. length == 0 ) return new int [ 0 ] ;
int left = 0 ;
int right = nums. length - 1 ;
while ( left < right) {
int sum = nums[ left] + nums[ right] ;
if ( sum == target) {
return new int [ ] { left + 1 , right + 1 } ;
} else if ( sum < target) {
left++ ;
} else {
right-- ;
}
}
return new int [ 0 ] ;
}