Day07 哈希表
1. 四数相加II
思路和两数之和非常像!使用字典存放哈希表,只是把一个数换成了两个数
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
dic = dict()
n = len(nums1)
count = 0
for i in range(n):
for j in range(n):
if nums1[i] + nums2[j] not in dic:
dic[nums1[i] + nums2[j]] = 1
else:
dic[nums1[i] + nums2[j]] += 1
for i in range(n):
for j in range(n):
if 0 - (nums3[i] + nums4[j]) in dic:
count += dic[0 - (nums3[i] + nums4[j])]
return count
2. 赎金信
● 383. 赎金信
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
dic = dict()
for m in magazine:
if m in dic:
dic[m] += 1
else:
dic[m] = 1
for i in ransomNote:
if i not in dic or dic[i] -1 <0:
return False
else:
dic[i] -=1
return True
3. 三数之和-推荐使用双指针
● 15. 三数之和
重点在去重,还需要对数组进行排序
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums = sorted(nums)
res = []
for i in range(len(nums)):
if nums[i] > 0:
return res
# 一定是i和i-1的数值比较去重
if i>0 and nums[i] == nums[i-1]:
continue
left = i+1
right = len(nums)-1
while right > left:
if nums[i] + nums[left] + nums[right] >0:
right -= 1
elif nums[i] + nums[left] + nums[right] < 0:
left +=1
else:
res.append([nums[i],nums[left],nums[right]])
while right > left and nums[left] == nums[left+1]:
left += 1
while right > left and nums[right] == nums[right-1] :
right -= 1
right -= 1
left += 1
return res
4. 四数之和
延续了三叔之和的思路
剪枝时不能直接nums[k] > target,因为target可以是负数
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
res = []
nums = sorted(nums)
n = len(nums)
for i in range(n):
# 剪枝
if nums[i]> target and nums[i] >0 and target > 0:
break
# 去重
if i >0 and nums[i] == nums[i-1]:
continue
for k in range(i+1,n):
# 剪枝
if nums[i]+nums[k]> target and target > 0:
break
# 去重
if k > i+1 and nums[k] == nums[k-1]:
continue
left, right = k+1, n-1
while right > left:
sum_ = nums[i] + nums[k] + nums[left] + nums[right]
if sum_ > target:
right -=1
elif sum_ < target:
left += 1
else:
res.append([nums[i],nums[k],nums[left],nums[right]])
while left<right and nums[left]==nums[left+1]:
left+=1
while left<right and nums[right]==nums[right-1]:
right-=1
left+=1
right-=1
return res
5. 总结
一般来说哈希表都是用来快速判断一个元素是否出现集合里。