383.赎金信
本题和字母异位词有异曲同工之妙。只需要查看字典中有没有哪个key的value是小于0的(有的元素被多减去了),就可以判断
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
record=dict()
for i in magazine:
record[i]=record.get(i,0)+1
for i in ransomNote:
record[i]=record.get(i,0)-1
for key in record.keys():
if record[key]<0:
return False
return True
四数相加Ⅱ
- 遍历A和B数组,统计出两个数组元素之和,和出现的次数,放到字典中
- 定义一个cnt,统计0-n3-n4出现的次数
- 遍历C和D数组,找到如果 0-(n3+n4) 在map中出现过的话,就用count把map中key对应的value也就是出现次数统计出来。
- 返回统计值cnt
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
record=dict()
for n1 in nums1:
for n2 in nums2:
if n1+n2 in record:
record[n1+n2]+=1
else:
record[n1+n2]=1
cnt=0 #用来统计n1+n2+n3+n4的数量
for n3 in nums3:
for n4 in nums4:
if 0-(n3+n4) in record:
cnt+=record[0-(n3+n4)]
return cnt
三数之和
本题并不像上一题可以利用哈希表的想法,但是可以利用一下双指针的思路;除此之外,因为要求不能有重复的元素,所以还要考虑去重的影响。
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
res=[]
nums.sort()
for i in range(len(nums)):
if nums[i]>0:
return res
if i>0 and nums[i]==nums[i-1]:
continue
left=i+1;right=len(nums)-1
while left < right:
if nums[i]+nums[left]+nums[right]<0:
left+=1
elif nums[i]+nums[left]+nums[right]>0:
right-=1
else:
res.append([nums[i],nums[left],nums[right]])
while right > left and nums[right]==nums[right-1]:
right-=1
while right > left and nums[left]==nums[left+1]:
left+=1
right-=1
left+=1
return res
倒数第二行和第三行的操作是在三数之和等于0时去寻找新的可能,因为当三数之和满足要求时,只移动一个指针是肯定无法满足要求的
四数之和