from collections import defaultdict
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
rec,cnt = defaultdict(lambda:0),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
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
dict1 = self.convert(ransomNote)
dict2 = self.convert(magazine)
for char,count in dict1.items():
if char not in dict2 or dict2[char] < count:
return False
return True
def convert(self,input_str:str) -> dict:
if not isinstance(input_str, str):
raise TypeError("Input must be a string")
return dict(Counter(input_str))
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 right>left:
sum_ = nums[i] + nums[left] + nums[right]
if sum_ < 0:
left += 1
elif sum_ >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
class Solution:
def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
freq = {}
for num in nums:
freq[num] = freq.get(num,0)+1
ans = set()
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 freq:
count = (nums[i]==val)+(nums[j]==val)+(nums[k]==val)
if freq[val] > count:
ans.add(tuple(sorted([nums[i],nums[j],nums[k],val])))
return [list(x) for x in ans]