454. 4Sum II
前两个数组(a,b)相加,与后两个数组(c,d)的和对比,即查0-(c+d)有没有在a,b sum里出现过。要记每个和对应出现的次数(不去重)。时间复杂度O(n^2)(因为是2*O(n^2))
要用defaultdict
class Solution(object):
def fourSumCount(self, nums1, nums2, nums3, nums4):
"""
:type nums1: List[int]
:type nums2: List[int]
:type nums3: List[int]
:type nums4: List[int]
:rtype: int
"""
from collections import defaultdict
dic = defaultdict(int)
count = 0
for i in range(len(nums1)):
for j in range(len(nums2)):
dic[nums1[i]+nums2[j]]+=1
for i in range(len(nums3)):
for j in range(len(nums4)):
if -nums3[i]-nums4[j] in dic:
count += dic[-nums3[i]-nums4[j]]
return count
383. Ransom Note
和242一样
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
from collections import defaultdict
dic = defaultdict(int)
for i in range(len(magazine)):
dic[magazine[i]]+=1
for i in range(len(ransomNote)):
dic[ransomNote[i]]-=1
for x in dic:
if dic[x]<0:
return False
return True
15. 3Sum
不用哈希表,因为要去重容易超时(?)
双(三)指针法,逐一移动第一个pointer,剩下两个放在剩余数组的两头。
去重用set就行(?)
s=set()
s.add((nums[i],nums[j],nums[k]))
output = list(s)
18. 4Sum
同,移动i,j,剩下两个放在剩余数组的两头