代码随想录训练营第七天|454|383

454.四数相加II

和两数相加一个思路,先来两个循环分别把两组数加一起算一次

 
class Solution:
    def fourSumCount(self, nums1: list, nums2: list, nums3: list, nums4: list) -> int:
        from collections import defaultdict
        rec = defaultdict(lambda:0) # 为访问的不存在的键生成默认值 0
        cnt = 0
        for i in nums1:
            for j in nums2:
                rec[i+j] += 1
        for i in nums3:
            for j in nums4:
                cnt += rec.get(-(i+j), 0)
        return cnt

383. 赎金信

太简单了

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        counts = {}
        for c in magazine:
            counts[c] = counts.get(c, 0) + 1
        for c in ransomNote:
            if c not in counts or counts[c] == 0:
                return False
            counts[c] -= 1
        return True

15. 三数之和

标注写了思路,主要是要先排序

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        result = []
        nums.sort() # 排序是必须的

        for i in range(n-2):
            if nums[i] + nums[i+1] + nums[i+2] >0: # 如果前三个数之和都大于零,那肯定没有符合条件的               break
            if nums[i] +nums[n-2] + nums[n-1] < 0: # 如果后两个都救不回第一个,说明第一个一定无用
                continue
            if i>0 and nums[i] == nums[i-1]: # 如果两个连续相同的,不用重复计算了
                continue
            l, r = i + 1, n - 1 # 双节点
            while l < r:
                tmp = nums[i] + nums[l] +nums[r]
                if tmp == 0: # 符合条件
                    result.append([nums[i] , nums[l] , nums[r]]) 
					# 避免重复填充
                    while l+1 <r and nums[l]==nums[l+1]: 
                        l+=1
                    l += 1
                    while l<r-1 and nums[r]==nums[r-1]:
                        r-=1
                    r-=1
                elif tmp<0: #小于零 右移
                    l +=1
                else: # 大于零左移
                    r-=1
        return result        
                    

全部评论
哈哈哈大佬都觉得简单
点赞 回复
分享
发布于 02-27 22:02 北京

相关推荐

2 收藏 评论
分享
牛客网
牛客企业服务