代码随想录算法训练营第七天 | 四数之和、赎金信、三数之和、四数之和2

代码随想录算法训练营第七天

383赎金信
https://leetcode.cn/problems/ransom-note/submissions/537782865/
383赎金信代码随想录
https://programmercarl.com/0383.赎金信.html#思路
四数之和2
https://leetcode.cn/problems/4sum-ii/
四数之和2代码随想录
https://programmercarl.com/0454.四数相加II.html#算法公开课
三数之和
https://leetcode.cn/problems/3sum/description/
三数之和代码随想录
https://programmercarl.com/0015.三数之和.html#思路
四数之和
https://leetcode.cn/problems/4sum/description/
四数之和代码随想录
https://programmercarl.com/0018.四数之和.html#算法公开课

383赎金信

题目

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

题解

和前面计数一样

四数之和2

题目

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

题解

  • 不要求题解中不出现重复数字
  • 从不同数组中挑数字 不需要考虑重复问题
  • 更简单
  • 1个哈希表 分别对2组数组计算即可

题解代码

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        hash_table ={}
        for num_1 in range(len(nums1)):
            for num_2 in range(len(nums2)):
                num = nums1[num_1]+nums2[num_2]
                hash_table[num] = hash_table.get(num,0)+1

        res = 0
        for num_3 in range(len(nums3)):
            for num_4 in range(len(nums4)):
                num = 0-(nums3[num_3]+nums4[num_4])
                if num in hash_table:
                    res = res + hash_table[num]

        return res

三数之和 + 四数之和

三数之和题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

四数之和题目

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

0 <= a, b, c, d < n
a、b、c 和 d 互不相同
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

题解(同类):

  • 首先排序
  • 固定指针,剩下由双指针计算两数之和;
  • 一开始使用二分法 这里不能用二分法 因为不确定一定存在;
  • 注意剪枝
    • 个数剪枝:不满足个数 直接返回
    • 遍历函数剪枝(target不确定时,需要确定数字正负):超过target返回->因为是按大小排序的
    • 指针剪枝:和前面相同直接跳过

题解代码

class Solution:
    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:
        if len(nums)<4:
            return []
        ##首先排除无结果的输入
        nums = sorted(nums)
        res = []

        ##初始化
        ##第一个遍历循环
        n = len(nums)
        for i in range(n):
            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,n):
                if nums[i]+nums[j]>target and nums[j]>0:
                    break
                if j>i+1 and nums[j]==nums[j-1]:
                    continue
                l = j+1
                r = n-1
                ##指针寻找target
                while l<r:
                    if nums[i]+nums[j]+nums[l]+nums[r]<target:
                        l = l+1
                    elif nums[i]+nums[j]+nums[l]+nums[r]>target:
                        r = r-1
                    else:
                        res.append([nums[i],nums[j],nums[l],nums[r]])
                        while 0<l<n-1 and nums[l+1]==nums[l]:
                            l = l+1
                        while l<r<n and nums[r-1]==nums[r]:
                            r = r-1
                        ##2个指针固定以后,可能有n个答案
                        l = l+1
                        r = r-1
        return res
posted @ 2024-06-07 12:08  哆啦**  阅读(2)  评论(0编辑  收藏  举报