Leetcode 打卡 day7 ● 454.四数相加II ● 383. 赎金信 ● 15. 三数之和 ● 18. 四数之和


提示:以下是本篇文章正文内容,下面案例可供参考

一、leetcode 454.四数相加II

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 分组+哈希表
    两两一组,将第一组枚举和的可能性并统计不同和的个数存进哈希表
    对另一组的和进行判断,如果在hashmap中,则res加上该和的可能个数。
		from collections import defaultdict
        dic = defaultdict(int)
        res = 0
        for i in range(len(nums1)):
            for j in range(len(nums2)):
                cur = nums1[i] + nums2[j]
                dic[cur] += 1
        for i in range(len(nums3)):
            for j in range(len(nums4)):
                cur = - nums3[i] - nums4[j]
                if cur in dic:
                    res += dic[cur]
        return res
		

二、leetcode 383. 赎金信

1.题目链接:

link

2.独立做题问题总结

一开始做的时候用的hashmap

3.解法总结:

  1. 哈希表
		from collections import defaultdict
        dic = defaultdict(int)
        for i in magazine:
            dic[i] += 1
        for j in ransomNote:
            if j not in dic:
                return False
            else:
                dic[j] -= 1
                if dic[j] < 0:
                    return False
        return True	
		
  1. python技巧
    !! 将list里的元素统计:collections.Counter(ransomNote)
		c1 = collections.Counter(ransomNote)
        c2 = collections.Counter(magazine)
        x = c1 - c2
        #x只保留值大于0的符号,当c1里面的符号个数小于c2时,不会被保留
        #所以x只保留下了,magazine不能表达的
        if(len(x)==0):
            return True
        else:
            return False

三、leetcode 15. 三数之和

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

双指针法
第一步对nums排序
先固定第一位i,然后采用l,r双指针对i以后元素进行选择,当i+l+r元素和== 0时,res储存,当小于0时,l++,当大于0时,r–。
减枝:1. 当i元素大于0时,直接返回res
去重:
§1. 第一个元素去重:i和i-1相等且i>0时,continue
§前提: i+l+r元素和== 0
§2. 第二个元素去重:当l+1和l相等时,l= l+1
§3. 第三个元素去重:当r-1和r相等时,r=r-1
while (right > left && nums[right] == nums[right - 1]) right–;
while (right > left && nums[left] == nums[left + 1]) left++;

		nums.sort()
        res = []
        for i in range(len(nums)):
            if nums[i] > 0:
                return res
            if i > 0 and nums[i] == nums[i - 1]:#去重
                continue
            l = i + 1
            r = len(nums) - 1
            while(l < r):
                if nums[i] + nums[l] + nums[r] > 0:
                    r -= 1
                elif nums[i] + nums[l] + nums[r] < 0:
                    l += 1
                else:
                    res.append([nums[i], nums[l], nums[r]])
                    while(r > l and nums[r] == nums[r - 1]):
                        r -= 1
                    while(r > l and nums[l] == nums[l + 1]):
                        l += 1
                    r -= 1
                    l += 1
                    # 
        return res
		

四、leetcode 18. 四数之和

1.题目链接:

link

2.独立做题问题总结

3.解法总结:

  1. 加一重for循环判定第二个元素
		nums.sort()
        res = []
        for i in range(len(nums)):
            if nums[i] > target and nums[i] >= 0:
                return res
            if i > 0 and nums[i] == nums[i - 1]:#去重
                continue
            for j in range(i + 1,len(nums)):
                # if (nums[i] + nums[j]) > target and (nums[i] + nums[j]) >= 0:
                #     return res
                if j > i + 1 and nums[j] == nums[j - 1]:#去重
                    continue
                l = j + 1
                r = len(nums) - 1
                while(l < r):
                    if nums[l] + nums[r] + nums[i] + nums[j] < target:
                        l += 1
                    elif nums[l] + nums[r] + nums[i] + nums[j] > target:
                        r -= 1
                    else:
                        if [nums[i],nums[j],nums[l],nums[r]] not in res:
                            res.append([nums[i],nums[j],nums[l],nums[r]])
                        print(i,j,l,r)
                        while(l < r and nums[r] == nums[r - 1]):
                            r -= 1
                        while(l < r and nums[l] == nums[l + 1]):
                            l += 1
                        l += 1
                        r -= 1
        return res

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值