1. 题目链接
https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted/
2. 题目描述
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。
说明:
返回的下标值(index1 和 index2)不是从零开始的。
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
输入: numbers = [2, 7, 11, 15], target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
3. 题目解析
这道题目可直接用暴力方法,遍历两次求解,不过时间复杂度会比较高,为O(n^2),我们考虑用二分查找。
二分查找是针对一个严格的递增或递减序列,找出一定规律的小标或元素,本题目是找出两数相加等于目标数target,该算法可以用[left,right]为整个序列的下标区间,当numbers[left] 和 numbers[right]相加等于target时即找到,小于时left加一,大于时right减一。该算法时间复杂度是O(logn),有效提高效率。
4. 代码实现
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){
int left = 0, right = numbersSize - 1;
int *res = (int*)malloc(sizeof(int) * 2);
while (left < right) {
if (numbers[left] + numbers[right] == target) {
break;
}
else if (numbers[left] + numbers[right] < target)
left++;
else
right--;
}
*returnSize = 2;
res[0] = left + 1;
res[1] = right + 1;
return res;
}
5. 提交记录
因篇幅问题不能全部显示,请点此查看更多更全内容