hash结构
1、两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
示例:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
利用字典key为hash表,value存入数组下标,一次遍历,查找之前是否存在目标值减当前值
def twoSum(self, nums, target):
if not nums:
return []
numdict={}
res=[]
for i,num in enumerate(nums):
if (target-num) in numdict.keys():
res.append(numdict[target-num])
res.append(i)
return res
numdict[num] = i
print(numdict)
return []
双指针
1、三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。
示例:
给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
先进行数组排序,再进行一轮遍历,第二轮以第二个数作为左指针遍历,第三个数作为右指针进行遍历,直到找到第二个数和第三个数相加为第一个数的相反数或者第二个数等于第三个数
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
n = len(nums)
res = []
for first in range(n):
if nums[first] > 0:
break
if first > 0 and nums[first] == nums[first - 1]:
continue
third = n - 1
target = -nums[first]
for second in range(first + 1, n):
if second - first > 1 and nums[second] == nums[second - 1]:
continue
while nums[second] + nums[third] > target and second < third:
third -= 1
if nums[second] + nums[third] == target and second != third:
res.append([nums[first], nums[second], nums[third]])
return res