代码随想录算法训练营第七天【哈希表】| 454,383,15,18

文章介绍了如何利用defaultdict数据结构解决4Sum问题,包括比较两个数组和的出现次数,以及RansomNote问题中检查字符是否能构建目标字符串。同时提到3Sum问题的双指针法解决方案,避免了哈希表去重导致的时间复杂度过高问题。
摘要由CSDN通过智能技术生成

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,剩下两个放在剩余数组的两头

  • 9
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值