167. 两数之和 II - 输入有序数组
贴个题目:
贴个示例:
解题思路:
1、双指针:
由于这是一个已经排好序的数组,因此两数相加==target,那么那两个数肯定是一个在左边,一个在右边,我们只需要弄两个指针,一个从头,一个从尾,向中间靠拢,直到找出两数之和的对应下标即可
贴代码:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
int *returnarray=(int*)malloc(sizeof(int)*2);
*returnSize=2;
int left=0;
int right=numbersSize-1;
while(left<right)//左指针必定比右指针小
{
if(numbers[left]+numbers[right]==target)
//如果找到了两数之和==target,就记录对应下标,跳出循环
{
returnarray[0]=left+1;
returnarray[1]=right+1;
left=right;
}
if(numbers[left]+numbers[right]>target) right--;
//如果两数之和大于target,就移动右指针
if(numbers[left]+numbers[right]<target) left++;
//如果两数之和小于target,就移动左指针
}
return returnarray;
}
性能分析:
时间分析:
遍历了一次数组,因此是时间复杂度是:O(n)
空间分析:
新建了常数个变量,因此空间复杂度是:O(1)
2、二分查找:
由于是有序数组,我们也可以使用二分查找,详情参考:力扣官方题解:167. 两数之和 II - 输入有序数组