今天我们来做一道LeetCode上的题目,原题链接:剑指 Offer 06. 从尾到头打印链表
题目描述
- 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。
- 示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
- 示例 2:
输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]
- 限制:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^6
思路分析
- 双指针从头部和尾部同时遍历
- 初始化: 双指针 ii , jj 分别指向数组 numsnums 的左右两端 (俗称对撞双指针)。
- 循环搜索: 当双指针相遇时跳出;
- 计算和 s = nums[i] + nums[j]s=nums[i]+nums[j] ;
- 若 s > targets>target ,则指针 jj 向左移动,即执行 j = j - 1j=j−1 ;
- 若 s < targets<target ,则指针 ii 向右移动,即执行 i = i + 1i=i+1 ;
- 若 s = targets=target ,立即返回数组 [nums[i], nums[j]][nums[i],nums[j]] ;
- 返回空数组,代表无和为 targettarget 的数字组合。
代码
# Python
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
start, end = 0, len(nums) - 1
while start < end:
total = nums[start] + nums[end]
if total > target:
end -= 1
elif total < target:
start += 1
else:
return [nums[start], nums[end]]
return []
总结
- 有兴趣可以试试二分法和Hash索引方法
- 当然双指针方法相对更优
附录
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情