刷题营 第7天

第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))

最后一句要记住 

15. 三数之和

哈希法去重很麻烦,用双指针法(必须先排序),此题去重是关键!

标红部分要特别注意,必须放到else循环里,还有最后left+1和right-1要好好理解

​​​​​​18. 四数之和

思路和三数之和一样,设置两重for循环,但是剪枝和去重比较重要,target可能是负数,所以剪枝操作需要判断target>0,nums[i]>0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值