第454题.四数相加II
四个数组两两分组循环,时间复杂度N方
使用数组,存a+b的值,以及出现的次数
import collections
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
record=collections.defaultdict[int]
for n1 in nums1:
for n2 in nums2:
if n1+n2 in record:(请问有什么错误)
record[n1+n2]+=1
else:
record[n1+n2]=1
count=0
for n3 in nums3:
for n4 in nums4:
key=-n3-n4
if key in record:
count+=record[key]
return count
383. 赎金信
初步想法:准备一个数组,下标是a-Z的字母,值是字母出现的次数,然后和后一个字符对比,后一个字符出现一次减去1,判断最后数组是否为0
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
ranson=[0]*26
for i in ransomNote:
ranson[ord(i)-ord('a')]+=1
for j in magazine:
ranson[ord(j)-ord('a')]-=1
if ranson==0:
return True
else:
return False (错误,ransom=【a,a】magazine=[a,a,b],没有考虑ranson是magazine子集的情况
错在哪里?
ransom_count = [0] * 26
magazine_count = [0] * 26
for c in ransomNote:
ransom_count[ord(c) - ord('a')] += 1
for c in magazine:
magazine_count[ord(c) - ord('a')] += 1
return all(ransom_count[i] <= magazine_count[i] for i in range(26))
最后一句要记住
哈希法去重很麻烦,用双指针法(必须先排序),此题去重是关键!
标红部分要特别注意,必须放到else循环里,还有最后left+1和right-1要好好理解
思路和三数之和一样,设置两重for循环,但是剪枝和去重比较重要,target可能是负数,所以剪枝操作需要判断target>0,nums[i]>0