题目描述:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
考察点:
要解决这个题,核心是要有双指针的思想。
解题思路:
通过循环查找,找到第一个比target大的数字,这个数字之前的数组元素为目标范围(这一步目的是为了缩小查找范围)
在目标范围内展开循环,查找与target相等的两数之和
然后让nums[left]和nums[right]相加,
如果比target大,right–,
如果比target小,left++,
相等则退出返回
如果退出循环还没有找到,就返回NULL
完整代码(C语言)
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
*returnSize=2;
int left=0;
int right=numsSize-1;
for(int i=0;i<numsSize;i++)
{
if(nums[i]>=target)
{
right=i-1;//记录第一个比target大的数字下标
break;
}
}
int tmp=0;
while(left<right)
{
tmp=nums[left]+nums[right];
if(tmp>target)
{
right--;
}
else if(tmp<target)
{
left++;
}
else
{
int* num=(int*)malloc(sizeof(int)*2);
assert(num!=NULL);
num[0]=nums[left];
num[1]=nums[right];
return num;
}
}
return NULL;
}