题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
思路:自己没有思路
双指针碰撞:本题主要理解一点,前后指针移动时,答案情况不会丢失!
因为如果 i 和 j处的值大于 target,j--; 和小于 target,i++;不会出现移动之后再需要倒回的情况!
因为 i 后移之后,j倒回就是当前的和小于 target,但是如果小于,原来的 i处值相加更小,不会出现原来的i后移;
如果j前移之后,i倒回,就是当前的和大于target,但是如果此时大于,之前的j处值相加肯定更大,不会出现j前移
代码:
1)双指针碰撞,和上一题类似,都是 逻辑上的指针(实际为数组下标的移动)
class Solution {
public int[] twoSum(int[] nums, int target) {
//根据排序数组的特性
int i = 0,j = nums.length - 1;
while(i < j){
int s = nums[i] + nums[j];
if(s > target) j--;
else if(s < target) i++;
else{
//这里需要直接返回
return new int[]{nums[i],nums[j]};
}
}
return new int[0];
}
}