题目解析
输入一个递增排序的数组和一个数字,在数组中查找两个数,使得它们的和正好是S。如果有多对数字的和等于S,则输出任意一对即可。
示例一:
输入:nums=[2,7,11,15],target=9;
输出:[2,7]或者[7,2]
示例二:
输入:nums=[10,26,30,31,47,60],target=40;
输出:[10,30]或者[30,10]
解题思路
这题的思路和有效三角形个数这个题思路很相像我们设left和right这两个变量分别指向数组两端,nums[left]+nums[right]一共就三种情况。当nums[left]+nums[right]大于target时候,例如数组nums=[2,7,11,15],target=9,nums[left]+nums[right]=2+15=17>9由于数组是递增排序,如果left向右移的话nums[left]不断增大,得到的nums[left]+nums[right]一定会大于target。因此我们需要right向左移来减小nums[right],这样nums[left]+nums[right]才会更加接近target。当nums[left]+nums[right]小于target时候,同理我们需要left向右移增大来使nums[left]+nums[right]更加接近target。直到使nums[left]+nums[right]=target。
代码实现
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
int *arr=malloc(sizeof(int)*2);
int left=0;
int right=numsSize-1;
while(left<right)
{
if(nums[left]+nums[right]==target)
{
arr[0]=nums[left];
arr[1]=nums[right];
break;
}
else if(nums[left]+nums[right]<target)
{
left++;
}
else
{
right--;
}
}
*returnSize=2;
return arr;
free(arr);
}
java实现
class Solution {
public int[] twoSum(int[] nums, int target)
{
int left=0;
int right=nums.length-1;
while(left<right)
{
int sum=nums[left]+nums[right];
if(sum>target)
{
right--;
}
else if(sum<target)
{
left++;
}
else return new int[] {nums[left],nums[right]};
}
return new int[]{0};
}
}
感谢您的阅读,欢迎留言评论。