难度简单8504收藏分享切换为英文关注反馈
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
1、暴力求解,效率低。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
lst = list()
count = len(nums)
for index, value in enumerate(nums):
for i in range(index+1, count):
if value + nums[i] == target:
lst.append(index)
lst.append(i)
break
return lst
2、hash方法,可用python的字典方法,效率高。
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
lst = list()
hash_dic = dict()
for index, value in enumerate(nums):
if target - value in hash_dic:
lst.append(hash_dic[target-value])
lst.append(index)
break
hash_dic[value] = index
return lst
3、双指针。
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
lst = []
for i, v in enumerate(nums):
lst.append((v, i)) # 保存 值-下标
nums_new = sorted(lst, key=lambda x: x[0]) # 按值小到大排序
left = 0 # 左指针
right = len(nums) - 1 # 右指针
res = []
while left < right:
if nums_new[left][0] + nums_new[right][0] < target:
left += 1 # 左指针往右
elif nums_new[left][0] + nums_new[right][0] > target:
right -= 1 # 右指针往左
else:
res.append(nums_new[left][1])
res.append(nums_new[right][1])
break
return res