给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
C代码:双指针从前后向中间遍历数组
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
int *ans = (int *)malloc( sizeof(int)*2 ); //采用malloc分配内存的方式返回数组
int low = 0, high = numbersSize-1;
while( low < high ) //双指针从前后向中间遍历数组
{
if( numbers[low]+numbers[high] == target )
{
ans[0] = low+1;
ans[1] = high+1;
break;
}
else if( numbers[low]+numbers[high] > target )
high--;
else
low++;
}
*returnSize = 2; //将返回数组的大小写进指针所指向的地址
return ans;
}
C代码:二分法
/**
* Return an array of size *returnSize.
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {
int *ans = (int *)malloc( sizeof(int)*2 );
for(int i=0; i<numbersSize-1; i++) //从0到numbersSize-1依次做二分法
{
int low = i+1;
int high = numbersSize-1;
while( low <= high ) //二分法
{
int mid = (low+high)/2;
if( numbers[i]+numbers[mid] > target )
high = mid-1;
else
low = mid+1;
}
if( numbers[i]+numbers[high] == target )
{
ans[0] = i+1, ans[1] = high+1; //位置=下标+1
break;
}
}
*returnSize = 2;
return ans;
}