利用「双指针对撞」、「二分查找」来解决有序数组的搜索问题,难度简单。
题目:
给定一个已按照 升序排列
的有序数组,找到两个数使得它们相加之和等于目标数
。
函数应该返回这两个下标值 index1
和 index2
,其中 index1
必须小于 index2
。
说明:
- 返回的下标值(index1 和 index2)不是从零开始的。
- 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:
1 2 3
| 输入: numbers = [2, 7, 11, 15], target = 9 输出: [1,2] 解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。
|
双指针对撞
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| class Solution { func twoSum(_ numbers: [Int], _ target: Int) -> [Int] { guard numbers.count > 0 else { return [] } var low = 0 var high = numbers.count - 1 while low < high { let sum = numbers[low] + numbers[high] if sum == target { return [low + 1, high + 1] } else if sum < target { low = low + 1 } else { high = high - 1 } } return [-1, -1] } }
|
二分查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| class Solution { func twoSum(_ numbers: [Int], _ target: Int) -> [Int] { guard numbers.count > 0 else { return [] } let len = numbers.count for left in 0..<numbers.count - 1 { let right = binarySearch(nums: numbers, left: left + 1, right: len - 1, target: target - numbers[left]) if right != -1 { return [left + 1, right + 1] } } return [-1, -1] } func binarySearch(nums: [Int], left: Int, right: Int, target: Int) -> Int { var theLeft = left var theRight = right while theLeft < theRight { let mid = (theLeft + theRight) >> 1 if nums[mid] < target { theLeft = mid + 1 } else { theRight = mid } } if nums[theLeft] == target { return theLeft } return -1 } }
|
参考:
二分法
官方题解
参考题解