454.四数相加II
四分二减小时间负杂度,由n**4变为n**2
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
d = {}
result = 0
for i in range(len(nums1)):
for j in range(len(nums2)):
d[nums1[i]+nums2[j]]=d.get(nums1[i]+nums2[j],0)+1
for i in range(len(nums3)):
for j in range(len(nums4)):
if 0-nums3[i]-nums4[j] in d:
result += d[0-nums3[i]-nums4[j]]
return result
383. 赎金信
字典法
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
d = {}
for i in ransomNote:
d[i] = d.get(i,0)+1
for i in magazine:
if i in d:
d[i] = d.get(i) - 1
for i in d:
if d[i] > 0:
return False
return True
5. 三数之和
注意去重循环很简单但去重很复杂很考验思维
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
result = []
nums.sort()
for i in range(len(nums)):
if nums[i] > 0 :
break
if i>0 and nums[i-1] == nums[i]:#a去重
continue
d = {}
for j in range(i+1,len(nums)):
c = 0 - nums[i] - nums[j]
if j>i+2 and nums[j-1]==nums[j]==nums[j-2]:
continue
if c in d :
result.append([nums[i],nums[j],c])
d.pop(c)
else:
d[nums[j]] = j
return result
18. 四数之和
与上题方法一样
也可以用字典法但时间复杂度较高很难在正规场合使用
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
d = {}
ans = set()
for i in range(len(nums)):
d[nums[i]] = d.get(nums[i],0) + 1
for i in range(len(nums)):
for j in range(i+1,len(nums)):
for k in range(j+1,len(nums)):
val = target - nums[i]- nums[j]-nums[k]
if val in d:
count = (nums[i]==val)+(nums[j]==val)+(nums[k]==val)
if d[val] > count:
ans.add(tuple(sorted([nums[i],nums[j],nums[k],val])))
return [list(x) for x in ans]