题目描述:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
解法一:暴力解法,双循环O(n^2)
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
e = target-nums[i]
for j in range(len(nums)):
if e == nums[j] and i!=j:
return i,j
解法二:双指针法,先进性排序,然后使用快慢指针从两段向中间逼近。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
# 对输入列表进行排序
nums_sorted = sorted(nums)
# 使用双指针
left = 0
right = len(nums_sorted) - 1
while left < right:
current_sum = nums_sorted[left] + nums_sorted[right]
if current_sum == target:
# 如果和等于目标数,则返回两个数的下标
left_index = nums.index(nums_sorted[left])
right_index = nums.index(nums_sorted[right])
if left_index == right_index:
right_index = nums[left_index+1:].index(nums_sorted[right]) + left_index + 1
return [left_index, right_index]
elif current_sum < target:
# 如果总和小于目标,则将左侧指针向右移动
left += 1
else:
# 如果总和大于目标值,则将右指针向左移动
right -= 1
解法三:哈希法
用字典作哈希表
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
m = dict()
for i, value in enumerate(nums):
if target - value in m:
return [nums.index(target - value),i]
m[value] = i
return []
用集合作哈希表
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
m = set()
for i, value in enumerate(nums):
if target - value in m:
return [nums.index(target - value),i]
m.add(value)
return []