算法训练第7天 | 454.四数相加II、383.赎金信

【哈希表】理论知识的应用题。万变不离其宗!

454.四数相加II

很好,看到这道题的第一反应就是四个for循环,时间复杂度直接拉满O(n^4)。好好好。

后来看了讲解,有了深刻又粗浅的理解:

本题主要考察对哈希表的运用,思路很像“两数之和”(两数之和思路)。我们需要把4个数组分成两组,一组包含两个,也就是:1)nums1+nums2,2)0-(nums3+nums4)。分开遍历,直接将O(n^4)降低为O(n^2)。

其中,我们将数组1与数组2的值相加存入字典,key为两数相加的和,value为这个和出现的次数

数组3和数组4相加时,则判断目标值与和的差,是否在上述字典中出现过。一涉及到“判断一个元素是否出现过”的题目就是哈希法!如果在,就count+该key对应的value。为啥是加value而不是加一,大家可以自己举个例子手算一下就懂了,大概就是用到排列组合的知识。

最后,就还是要熟悉字典的使用规范。

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        hashmap = dict()
        count = 0
        
        for a in nums1:
            for b in nums2:
                if a+b in hashmap:
                    hashmap[a+b] += 1
                else:
                    hashmap[a+b] = 1
        
        for c in nums3:
            for d in nums4:
                if 0-(c+d) in hashmap:
                    count += hashmap[0-(c+d)]
        
        return count

383.赎金信

OMG,自己写的一遍过!我宣布我正在变强!

本题与“有效字母异位词”很像(异位词思路)。主体思路可学习,但不同点在于,本题不是互相组成,而是判断字符串1是否可以由字符串b组成,也就是字符串2的字母数量多于字符串1所包含的字母数量就行!!!

另外,题目只包含小写字母,数量固定,那么我们可以直接使用数组哈希法

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        record1 = [0] * 26
        record2 = [0] * 26
        base = ord('a')

        for i in ransomNote:
            record1[ord(i) - base] += 1
        
        for j in magazine:
            record2[ord(j) - base] += 1

        for i in range(26):
            if record1[i] > record2[i]:
                return False
            i += 1
                    
        return True

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值