代码随想录训练营第七天|454|383
454.四数相加II
和两数相加一个思路,先来两个循环分别把两组数加一起算一次
class Solution:
def fourSumCount(self, nums1: list, nums2: list, nums3: list, nums4: list) -> int:
from collections import defaultdict
rec = defaultdict(lambda:0) # 为访问的不存在的键生成默认值 0
cnt = 0
for i in nums1:
for j in nums2:
rec[i+j] += 1
for i in nums3:
for j in nums4:
cnt += rec.get(-(i+j), 0)
return cnt
383. 赎金信
太简单了
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
counts = {}
for c in magazine:
counts[c] = counts.get(c, 0) + 1
for c in ransomNote:
if c not in counts or counts[c] == 0:
return False
counts[c] -= 1
return True
15. 三数之和
标注写了思路,主要是要先排序
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
n = len(nums)
result = []
nums.sort() # 排序是必须的
for i in range(n-2):
if nums[i] + nums[i+1] + nums[i+2] >0: # 如果前三个数之和都大于零,那肯定没有符合条件的 break
if nums[i] +nums[n-2] + nums[n-1] < 0: # 如果后两个都救不回第一个,说明第一个一定无用
continue
if i>0 and nums[i] == nums[i-1]: # 如果两个连续相同的,不用重复计算了
continue
l, r = i + 1, n - 1 # 双节点
while l < r:
tmp = nums[i] + nums[l] +nums[r]
if tmp == 0: # 符合条件
result.append([nums[i] , nums[l] , nums[r]])
# 避免重复填充
while l+1 <r and nums[l]==nums[l+1]:
l+=1
l += 1
while l<r-1 and nums[r]==nums[r-1]:
r-=1
r-=1
elif tmp<0: #小于零 右移
l +=1
else: # 大于零左移
r-=1
return result

