代码随想录训练营第七天|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