题目:
给定一组排好序的升序数组numbers
,保证数组中没有重复出现的数字,从数组中找到两个数,这两个数相加的和等于target
,写出get_tow_sum
,返回这两个数的下标(下标从0
开始),较小的下标在前,保证存在唯一的解。
int* get_two_sum(int *numbers, int length, int target) {
int *ans = (int *)malloc(sizeof(int) * 2);
return ans;
}
思路一:
一个遍历,一个二分:O( nlog(n) )
target 减i
等于新的tget
,在i + 1
到right
的区间内二分寻找tget
,若没找到i++
,直到i = right - 1
为止。
思路二:
头尾指针:O(n)
——(数组有序,思路二最优)
1、如果left + right < target; left++
2、如果right + left > target; right--
思路三:
Hash
: O(n)
——(数组无序,hash最优)
将target-i
变成数组下标,数组中存放i
: arr[target-i] == i
int* get_two_sum(int *numbers, int length, int target) {
int *ans = (int *)malloc(sizeof(int) * 2);
ans[0] = 0; ans[1] = length - 1;
int sum = 0;
while (1) {
if ((sum = numbers[ans[0]] + numbers[ans[1]]) > target) ans[1]--;
else if (sum < target) ans[0]++;
else return ans;
}
return ans;
}