Day7代码随想录哈希表part02-454. 四数相加 II、383. 赎金信、15. 三数之和、18. 四数之和

454. 四数相加 II

本题的思路相对而言比较简单,首先先存储ab的和出现的频率,再统计cd的和有没有符合sum(a,b)+sum(c,d) =0,最终得到结果

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        absum = {}
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                resab = nums1[i]+nums2[j]
                if resab in absum:
                    absum[resab] +=1 #统计ab相加和出现的次数
                else:
                    absum[resab] = 1
        count =0
        for i in range(len(nums3)):
            for j in range(len(nums4)):
                rescd = nums3[i] + nums4[j]
                if 0-rescd in absum:
                    count += absum[0-rescd]
        return count

383. 赎金信

一些同学可能想,用数组干啥,都用map完事了,其实在本题的情况下,使用map的空间消耗要比数组大一些的,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是费时的!数据量大的话就能体现出来差别了。 所以数组更加简单直接有效!

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        res = [0]*26
        for i in ransomNote:
            res[ord(i)-ord('a')] += 1
        for i in magazine:
            res[ord(i)-ord('a')] -= 1
        for i in range(len(res)):
            if res[i] >0:
                return False
        return True

15. 三数之和

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        res = []
        nums.sort() # 要先进行排序
        for i in range(len(nums)):
             # 如果第一个元素已经大于0,不需要进一步检查
            if nums[i] >0:
                return res
            if i>0 and nums[i] == nums[i-1]:
                continue
            left = i+1
            right = len(nums)-1
            while left<right:
                sum_all = nums[i] + nums[left] + nums[right]
                if sum_all >0:
                    right-=1
                if sum_all <0:
                    left +=1
                if sum_all ==0:
                    res.append([nums[i], nums[left], nums[right]])
                    while left<len(nums)-1 and nums[left]==nums[left+1]:
                        left += 1
                    while right>i+1 and nums[right]==nums[right-1]:
                        right -= 1
                    left += 1
                    right -= 1
        return res

18. 四数之和

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        res = []
        nums.sort() # 要先进行排序
        for k in range(len(nums)):
            if nums[k]>target and nums[k]>0 and target>0: # 剪枝
                break
            if k>0 and nums[k] == nums[k-1]: #去重
                continue
            for i in range(k+1, len(nums)):
                # 如果第一个元素已经大于0,不需要进一步检查
                if nums[i]+nums[k] >target and target>0: # 剪枝
                    break
                if i>k+1 and nums[i] == nums[i-1]: #去重
                    continue
                left = i+1
                right = len(nums)-1
                while left<right:
                    sum_all = nums[k] + nums[i] + nums[left] + nums[right]
                    if sum_all >target:
                        right-=1
                    if sum_all <target:
                        left +=1
                    if sum_all ==target:
                        res.append([nums[k], nums[i], nums[left], nums[right]])
                        while left<len(nums)-1 and nums[left]==nums[left+1]:
                            left += 1
                        while right>i+1 and nums[right]==nums[right-1]:
                            right -= 1
                        left += 1
                        right -= 1
        return res

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值