根据“三数之和”的思想,我采用了 排序+双指针 的算法👇
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 先将nums从小到大排序
sorted_nums=sorted(nums)
nums_len=len(nums)
# nums[i]+nums[j]=target
# 双指针
left_pointer=0
right_pointer=nums_len-1
while left_pointer<right_pointer:
left=sorted_nums[left_pointer]
right=sorted_nums[right_pointer]
if left+right<target:
left_pointer+=1
elif left+right>target:
right_pointer-=1
else:
if left!=right:
# 注意题目要求返回原数组索引
return [nums.index(left),nums.index(right)]
else:
# 特殊情况,当left==right时
# index方法只能返回第一个索引
first_ans=nums.index(left)
nums[first_ans]=None
second_ans=nums.index(left)
return [first_ans,second_ans]
哈希表 为本题更简单的方法,官方代码如下👇
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# {元素:索引}
hashtable = dict()
for i, num in enumerate(nums):
if target - num in hashtable:
return [hashtable[target - num], i]
hashtable[nums[i]] = i
return []
就已经排好序的数组来说,(针对两数之和问题)双指针算法的时间复杂度和空间复杂度都更低,优于 哈希表 算法。
就乱序的数组来说,无法使用双指针逼近 target 值,哈希表 算法可以记忆存储先前遍历过的值及其对应的索引,具有较好的时间复杂度。