首页 > 编程语言 >代码随想录算法训练营第七天 | 四数之和、赎金信、三数之和、四数之和2

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

时间:2024-06-07 12:34:44浏览次数:17  
标签:四数 target nums int 三数 随想录 num https

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

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

标签:四数,target,nums,int,三数,随想录,num,https
From: https://www.cnblogs.com/P201821440041/p/18237004

相关文章

  • 代码随想录算法训练营第八天 | 字符串:344反转字符串、
    反转字符串https://leetcode.cn/problems/reverse-string/反转字符串代码随想录https://programmercarl.com/0344.反转字符串.html#算法公开课反转字符串题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外......
  • 代码随想录算法训练营 第三天 链表 Leetcode203 移除链表元素 Leetcode707 设计链表 L
    Leetcode203移除链表元素 题目链接注意为了使后续节点方式统一 要人为设置链表头节点链表的处理一定要明白如何找前置节点/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*L......
  • 代码随想录算法训练营第30天 | 332.重新安排行程 、51. N皇后、37. 解数独
    332.重新安排行程(可跳过)https://programmercarl.com/0332.重新安排行程.html有难度,涉及到图,有些用例会超时/***@param{string[][]}tickets*@return{string[]}*/varfindItinerary=function(tickets){constres=['JFK'];constmap={};for(le......
  • 代码随想录第2天 | 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II ,数组总结
    题目:977.有序数组的平方思路:first.for循环,平方,然后sort排序,提交通过啊哈~|但时间复杂度大O(n+nlogn),->O(nlogn)的时间复杂度,题目进阶要求时间复杂度为O(n)second.双指针。题目为有序数组,包含负数,则平方后,最大值在数组的两头,则使用双指针进行,两个比较大小,大的存入新......
  • 代码随想录算法训练营第二十九天 | 491.非递减子序列
    491.非递减子序列题目链接文章讲解视频讲解层间去重:回溯法相当于深搜,所以所以是一直递归到叶节点才开始回溯;每次进入backtracking也就进入了搜索树的下一层,所以每进入一层需要用一个used_set来记录使用过的元素;classSolution{private:vector<int>sub;vecto......
  • 代码随想录算法训练营第一天 | 704. 二分查找 27. 移除元素
    704.二分查找题目:给定一个n个元素有序的(升序)整型数组和一个目标值target,写一个函数搜索nums中的target,如果目标值存在返回下标,否则返回-1。提示:1.你可以假设nums中的所有元素是不重复的。2.n将在[1,10000]之间。3.nums的每个元素都将在[-9999,9999]之间。解题:思路:二......
  • 代码随想录算法训练营第二十八天 | 93.复原IP地址
    93.复原IP地址题目链接文章讲解视频讲解classSolution{private:vector<string>ip;vector<string>result;public:vector<string>restoreIpAddresses(strings){backtracking(s,0);returnresult;}voidbacktrackin......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素(数组)
    第一次打卡,记录还不够充分,会慢慢丰富起来一、二分查找题目链接:704.二分查找-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想录讲解 情况1:左闭右闭区间情况2:左闭右开区间 二、移除元素题目链接:27.移除元素-力扣(LeetCode)讲解链接:Carl讲解视频讲解:代码随想......
  • 代码随想录算法训练营第一天 | 704. 二分查找,27. 移除元素
    题目链接:704.二分查找思路:该题为有序数组查找,采用二分法。根据区间分为左闭右闭和左闭右开两种情况坑:左右区间的开闭补充:vector容器时间复杂度:O(logn)空间复杂度:O(1)题目链接:27.移除元素思路:题目说返回k个元素之后留下什么不重要,也不考虑数组剩下元素的......
  • 代码随想录 数组总结
    数组总结主要包括二分法双指针滑动窗口模拟 二分法 循环不变量原则拓展考虑学习浮点数二分整数二分扩展题目双指针 快慢指针 原地解决问题、双向解决问题 滑动窗口滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)......