给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。
函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。
假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。
因为已知数组是升序排列了,那么我们可以通过二分法去查找target-x
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i=0;i<nums.length;i++){
int low=i,high=nums.length-1;
while(low<=high){
int mid=(high-low)/2+low;
if(nums[mid]==target-nums[i]){
return new int[]{i,mid};
}else if(nums[mid]>target-nums[i]){
high = mid - 1;
}else{
low = mid + 1;
}
}
}
return new int[0];
}
}
另一种方法我们还是使用双指针,我们假定最左left和最右right的两项和sum为我们的答案,如果sum>target的话那么我们就需要将right向左移来减小sum,如果sum<target的话,那么我们就需要将left向右移来增加sum,直到我们得到最终的答案
class Solution {
public int[] twoSum(int[] nums, int target) {
int left=0,right=nums.length-1;
while(left<=right){
int sum=nums[left]+nums[right];
if(sum==target){
return new int[]{left,right};
}else if(sum>target){
right--;
}else{
left++;
}
}
return new int[0];
}
}