文章目录
1.两数之和—two sum
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回它们的数组下标。数组中同一个元素在答案里不能重复出现。
这道题有三种解法:
a.暴力解法
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""
暴力解法:时间复杂度为O(n^2)
"""
for i in range(len(nums)-1):
for j in range(i+1,len(nums)): # 元素不能重复使用
if nums[i] + nums[j] == target:
return [i,j]
b.哈希表解法
创建一个哈希表,对于每一个x,我们首先查询哈希表中是否存在 target - x,然后将x插入到哈希表中,即可保证不会让x和自己匹配
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""
哈希表:时间复杂度为O(n)
"""
map = {
}
for i in range(len(nums)):
if target - nums[i] in map:
return [map[target-nums[i]],i]
else:
map[nums[i]] = i
双指针解法
两个指针分别从左从右开始扫描,每次判断这两个数相加是不是target,如果小了,那就把左边的指针向右移,如果大了,右指针左移
class Solution:
def twoSum(self, nums: List[int], target: int) -> List[int]:
"""
双指针解法:时间复杂度为O(n)
"""
arr = nums.copy() # 保留原索引
arr.sort()
left = 0 # 左指针
right = len(nums) - 1 # 右指针
while left < right:
if arr[left] + arr[right] > target:
right -= 1
elif arr[left] + arr[right] < target:
left += 1
else:
break
# 循环结束条件:left = right,或者nums[left] + nums[right] = target
result = []
if left == right:
return "no solution"
else:
for k in range(len(nums)):
if nums[k] == arr[left] or nums[k] == arr[right]:
result.append(k)
return result
1.1 两数之和—返回元素
如果假设输入一个数组nums和一个目标和target,请你返回nums 中能够凑出target的两个元素的值,比如输入nums =[5,3,1,6], target = 9,那么算法返回两个元素[3,6]。可以假设只有且仅有一对儿元素可以凑出target。
class Solution:
def twoSum(self