1.题目:
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
2.示例:
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
3.思路:
思路1:因为数组本身是有序的,那么完全可以在数组的开头 start 和结尾 end 位置各设置一个指针,通过二者的加和 sum 来找到目标值 target,如果 sum < target,则 start++,这样可以让下一次的 sum 变大,如果 sum > target,则 end--,这样可以让下一次的 sum 变小,找到结果
思路2:定一移一。使用两个指针,将第一个指针定为固定的元素。后一个指针指向第一个指针后面的元素。后面的指针遍历数组,直到遍历完整个数组。
4.代码:
思路一:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int *rets;
*returnSize = 2;
rets = malloc(sizeof(int)*2);
int i,j;
int start=0,end=numsSize-1;
int sum = 0;
while(1){
sum = nums[start] + nums[end];
if(sum<target){
start++;
}
if(sum>target){
end--;
}
if(sum==target){
rets[0] = nums[start];
rets[1] = nums[end];
break;
}
}
return rets;
}
思路二:
#include <stdio.h>
int main()
{
int rets[1];
int nums[7] = {14,15,16,22,53,60,76};
int i,j;
for(i=0;i<7;i++){
for(j=i+1;j<7;j++){
if(nums[i]+nums[j]==76){
rets[0] = nums[i];
rets[1] = nums[j];
}
}
}
for(i=0;i<2;i++){
printf("%d ",rets[i]);
}
}
相比较,第二种算法简洁一些。但在leetcode提交时会超时,无法通过。