Leetcode 数组题合集 18.FourSum

triton-inference-server-ge-backend 新版本特性 v2.3.0 支持对全局、session、graph 的options进行添加,从而进一步调优模型,相关案例请参考 性能调优方法论。 支持采用分档模式将符合条件模型转化为静态图,提高吞吐性能。 补充如何采用分档模式+锁核+调整精度,进一步提高性能。 在AscendHub下载镜像时需确认好版本,若使用旧版本镜像,需要手工下载源码编译生成新的backend后才能支持新特性。 版本特性 v2.2.0 支持从onnx文件读取模型输入输出信息, config中若无指定input,output,将会自动从文件中读取; 调整动态图在多实例下使用多Session方式,提高并发吞吐(显存占用会增高); 支持动态batch场景小batch动态合并特性,配合多Session,提高吞吐; 补充调优方法论以及cnclip模型的最佳实践; 支持多模型特性,可支持同时拉起多个模型,提高显存利用率; 支持非0轴动态shape场景; 支持TensorFlow的pb文件。 立即下载

Difficulty:Medium

Description

Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

The solution set must not contain duplicate quadruplets.

Example:

Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.

A solution set is:
[
  [-1,  0, 0, 1],
  [-2, -1, 1, 2],
  [-2,  0, 0, 2]
]

算法

首先是如何解决3数之和的, 3数之和是在2数之和的基础上包装一个外循环, 这个外循环有一个指针循环指向元素的值v, 通过它寻找数值对: 数值对之和等于target - v.

有两种方法:
1.双指针, 在一个排好序的数组里
2.哈希表.

总结

我们可以通过加一个外循环将3数之和进阶成4数之和, 同理,我们还可以解决5数之和, 6数之和等等.
真正核心的是kSum,

实现

双指针

此法需要数组被排好序.
然后需要解决重复问题: 重复的数相邻, 可以跳开.

对于3数之和, 我们单循环列举每个值, 使用双指针遍历剩下的值.
对k数之和, 我们使用k-2个嵌套的循环列举k-2个值的组合.

实现

我们可以递归实现k -2个循环, 我们传递开始开始起点和k作为参数, 当k==2时,终止循环.

1.For 4Sum function

  1. 对数组nums进行排序
    
  2. 调用函数并传参start = 0,k = 4, 和target, 然后返回结果

2.For kSum function:

  • 检查k个最小值之和是否大于target, 或者k个最大值之和是否小于taget,
    既然数组已经排好序了, 那么最小值就是numsp[start],
    如果上述两种情况都符合, 那么结束循环

  • 如果k==2, 调用twoSum并返回结果

  • 从start开始迭代i

    • 如果现在指向的值和前一个相同, 那么跳过

    • 递归调用kSum传参start = i + 1, k = k - 1.target = target - numsp[i]

    • 对于每个返回的set的值

      • 将现在指向的值 nums[i] 放入 set
      • 将 set 放入 最后返回的结果res
  • 返回最终结果res

3.For twoSum function:

  • 将指针lo 指向start, 指针hi指向最后一个数

  • 当lo< hi:

    • 如果nums[lo] + nums[hi] < target , 自增 lo

      • 如果 nums[lo - 1] == nums[lo] 同样自增 lo
    • 如果nums[lo] + nums[hi] > target, 自减hi

      • 如果 nums[hi] == nums[hi+1]
    • 最后, 找到这个数值对:

      • 将它添加到res中
      • 自减hi和自增lo
  • 返回结果 res

C++代码
在这里插入图片描述

class Solution
{
public:
    vector<vector<int>> fourSum(vector<int> &nums, int target)
    {
        sort(begin(nums), end(nums));
        return kSum(nums, target, 0, 4);
    }

    vector<vector<int>> kSum(vector<int> &nums, int target, int start, int k)
    {
        vector<vector<int>> res;

        //数组长度为1
        //k个最小值>target
        //k个最大值<target
        if (start == nums.size() || nums[start] * k > target || target > nums.back() * k)
        {
            return res; //返回空集
        }

        //调用twoSum
        if (k == 2)
        {
            return twoSum(nums, target, start);
        }

        for (int i = start; i < nums.size(); ++i)
        {
            if (i == start || nums[i - 1] != nums[i])
            {
                //递归调用kSum
                for(auto &set : kSum(nums, target - nums[i], i + 1, k - 1)){
                    res.push_back({nums[i]});

                    //在end(res.back())即上一句生成的{nums[i]}中的nums[i]前插入set所有的元素
                    res.back().insert(end(res.back()), begin(set), end(set));
                }
            }
        }
        return res;
    }

    vector<vector<int>> twoSum(vector<int> &nums, int target, int start)
    {
        vector<vector<int>> res;
        int lo = start, hi = nums.size() - 1;

        while (lo < hi)
        {
            int sum = nums[lo] + nums[hi];
            if(sum < target || (lo > start&& nums[lo] == nums[lo - 1])){
                ++lo;
            }else if(sum > target || (hi < nums.size() - 1 && nums[hi] == nums[hi + 1])){
                --hi;
            }else{
                res.push_back({nums[lo++], nums[hi--]});
            }
        }

        return res;
    }
};

时间复杂度

O(n ^(k-1)) , or O(n ^3) for 4Sum.
需要进行k - 2次循环, twoSum的复杂度为O(n)
当 k > 2时, 排序不能改变总体的时间复杂度

空间复杂度

O(n). 递归需要O(k)空间, k 是 算法最坏的情况时n的取值

注意 : 这里我们忽视了输出所需要的内存.

哈希表

可以使用哈希表一次遍历, 例如2sum:on-pass Hash Table

在3sum:hash set中(需要会员), 我们无需对数组排序就可解决问题. 为了实现它, 我们用三元组对值进行排序, 然后在哈希表中追踪.
对k个值进行同样的操作是不现实的

所以, 我们这里和双指针算法一样对数组进行排序,然后跳过重复值. 所以, 这里仅仅2sum部分的代码和上面不同.

实现

2sum部分的代码和Two Sum:One-pass Hash Table几乎一样 区别在于跳过重复值, 既然数组排序了, 我们仅需要比较res中的最后一个元素.
在这里插入图片描述

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(begin(nums), end(nums));
        return kSum(nums, target, 0, 4);
    }
    
    vector<vector<int>> kSum(vector<int>& nums, int target, int start, int k){
        vector<vector<int>> res;
        if (start == nums.size() || nums[start] * k > target || target > nums.back() * k)
            return res;
        
        if (k == 2)
            return twoSum(nums, target, start);
        
        for (int i = start; i < nums.size(); ++i)
             if (i == start || nums[i - 1] != nums[i])
                 for (auto &set : kSum(nums, target - nums[i], i + 1, k - 1)) {
                     res.push_back({nums[i]});
                     res.back().insert(end(res.back()), begin(set), end(set));
                 }
        
        return res;
    }
    
    vector<vector<int>> twoSum(vector<int>& nums, int target, int start){
        vector<vector<int>> res;
        unordered_set<int> s;
        
        for(auto i = start; i < nums.size(); ++i){
            //res为空
            //能找target-nums[i],nums[i],但nums[i]==nums[i-1]
            if(res.empty() || res.back()[1]!=nums[i])
                if(s.count(target - nums[i]))
                    res.push_back({target - nums[i], nums[i]});
            
            s.insert(nums[i]);
        }
        return res;
    }
};

时间复杂度

O(n ^(k-1)) , or O(n ^3) for 4Sum.
对n个数需要进行k - 2次循环, twoSum的复杂度为O(n)

当 k > 2时, 排序不能改变总体的时间复杂度

空间复杂度

哈希表需要O(n).
递归造成哈希表的空间不超过O(n).

参考:4Sum

后端开发 Docker4.99.0 AppleSilicon 苹果芯片 Mac 安装包 本资源为 Docker Desktop 4.99.0 苹果芯片(Apple Silicon)专用安装包,原生适配 M 系列 Mac,可快速搭建本地容器开发环境,支持镜像拉取、容器编排、项目打包部署。适合后端开发、运维、全栈开发者,用于本地微服务、测试环境、项目容器化开发。 立即下载

相关推荐

孤读paper——《GhostNet:More Features from Cheap Operations》

《GhostNet:More Features from Cheap Operations》   发现一个点并解决就是一篇CVPR,该文章主要发现了优秀的网络的特点是feature map提取过程中的冗余性,这种冗余性体现在很多成对的feature map间很像,就好像彼此的“ghost”,而这种特征冗余性对于理解图像来说还是必要的,所以文章把feature map分为两种,一种是本质特征,一...

雄关漫道真如铁 而今迈步从头越 5151

leetcode 中twoSum、threeSum、fourSum以及NSum

在leetcode中 twoSum解决思路主要是排序的数组后,以升序为例,先从右端固定一个值Fx,然后从固定值的左邻居Ni开始遍历,如果固定值Fx+Ni=target,则break结束,否则,Fx向左移动一个值,同样思路左邻居顺序移动遍历,如果要求出所有的这种组合,那么Fx+Ni=target后,不执行break,直到Fx为倒数第二数为止。当然这里也可以优化,基本上固定一个值后左邻居Ni的值已经固...

fsfsfsdfsdfdr的博客 741

映泰TB250-BTC主板魔改BIOS支持8/9代CPU实战与开机故障排查

BIOS(基本输入输出系统)是计算机硬件与操作系统之间的桥梁,负责初始化硬件和提供运行时服务。其工作原理是通过存储在主板芯片中的固件程序,在上电自检(POST)阶段完成对CPU、内存等关键组件的检测与配置。魔改BIOS的技术价值在于突破硬件限制,通过修改微码和电源管理模块,让旧平台支持新处理器,从而以极低成本实现性能跃升,在预算有限或追求极致性价比的DIY、办公和软路由等应用场景中极具吸引力。本文以映泰TB250-BTC矿板为例,详细解析了通过软刷方式刷入魔改BIOS,并重点解决了刷写后常见的“开机风扇转一

weixin_29164185的博客 406

LeetCode算法题:四数之和fourSum

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意: 答案中不可以包含重复的四元组。 示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为...

Mike的博客 689

C/C++跳动的爱心(完整代码)

C语言实现跳动的爱心的完整代码。

AIGC 5842

ComfyUI 汉化教程(中文界面)

如果你对翻译的结果不满意,还可以进行修改。首先,进入目录,可以看到该目录中有很多 JSON 文件:打开 JSON 文件,找到要修改的内容,修改对应的Value值即可:最后,重启 ComfyUI 即可。

水滴的博客 1万+

力扣LeetCode #18 四数之和(FourSum)

- 题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以包含重复的四元组。 来源:LeetCode(https://leetcode-cn.com/problems/4sum) - 示例 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0,满足要求的四元组集合为: [[

weixin_49155948的博客 313

国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。网上现在并没有v2版本的GmSSL可用的命令行文章,本章用于记录这些命令。本文原创自csdn博客,其他网站看到这篇文章都是盗,版,爬。虫。网站,支持原创,远离盗版。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 4604

leetcode018 Four Sum

题目18. 4 Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: - E

jnuyanfa的博客 489

华为OD机试双机位C卷-简单的解压缩算法(C/C++/Py/Java/Js/Go)

华为OD机试(机考)双机位C卷 【简单的解压缩算法】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD真题【简单的解压缩算法】。

qq_45776114的博客 475

YOLO26科研优化:多损失函数(EIoU、SIoU等)融合,让边界框回归精度再上台阶

将原有损失函数替换为我们编写的MultiLoss。例如,在bbox_loss。

LXY_LOVE36的博客 172

[LeetCode] 4Sum 四数之和解法(本算法n数之和都能解)

[LeetCode] 4Sum 四数之和解法(本算法3数求和能解, n数之和都能解)

lm2009200的博客 4549

【异常】Cursor编辑器 “Taking longer than expected...“ 报错全链路排查与解决方案

该提示并非传统的程序崩溃或语法报错,本质是Cursor编辑器的超时预警机制——当核心任务(云端AI推理请求、本地项目索引等)的执行耗时超出系统预设阈值时,触发的用户告知类提示,核心诱因是任务执行全链路出现阻塞或性能瓶颈。以下方案按排查优先级从高到低排序,覆盖从快速急救到根因根治的全流程,可按步骤逐步验证解决。针对大仓库、多依赖项目的索引超时问题,核心是通过规则过滤无效文件,从根源降低索引负载。

奶爸的编程之路,也就一周冷个三天 3101

LeetCode(2) Two Sum / Three Sum / Four Sum / K Sum

题目:两数之和描述:给定一个整数数列,找出其中和为特定值的那两个数。你可以假设每个输入都只会有一种答案,同样的元素不能被重用。示例:给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]代码://时间复杂度O(n^2) class Solution { public int[] t...

daojiezhe的博客 489

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

14_leetcode_fourSum

1.数组中元素ge shu

ezzffzz的专栏 467

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Leetcode 之 twoSum, ThreeSum, FourSum(K-Sum)问题

Leetcode之k sum 问题

BruceWayne94的博客 644

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode18---fourSum(可扩展自ksum)

LeetCode--184sum Given an arraynumsofnintegers and an integertarget, are there elementsa,b,c, anddinnumssuch thata+b+c+d=target? Find all unique quadruplets in the array which gi...

qq_22158743的博客 224

leetcode 18. 4Sum KSum的解决办法

Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: The solution set

JackZhangNJU的专栏 1422

【leetcode】 4 sum

4Sum Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. No

benbenab的专栏 1170

LeetCode (1) Two Sum (15)Three sum (16)Three sum closest (17)Four sum

自己闲置了一段时间了,现在开始进入奔跑模式。从在LeetCode上刷题开始吧。按照题目的创建时间的顺序开始刷。 Two Sum题目在这里 http://oj.leetcode.com/problems/two-sum/。 题目大意是,给定一个数组numbers[ ],给定一个数target,如何从数组numbers[ ]中找到两个数,使得这两个数加起来为target.(可以假定这两个数是一定存

BUILD 4880

K-SUM问题

一.2SUM问题 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use...

bestrivern的博客 568

Four Sum || LeetCode-18

Four Sum || LeetCode-18 Problem link:https://leetcode.com/problems/4sum/#/description Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target?

Be a learner Not a knower. 620

LeetCode--18--medium--FourSum

package com.app.main.LeetCode; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * id = 18 * level = medium * Given an array nums of n integers and an integer targe...

huangdingsheng的博客 180

Leetcode -- 4 sum

问题链接:https://oj.leetcode.com/problems/4sum/ 问题描述: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the arra

chaochen1407的专栏 368

LeetCode 4 sum 解法

题目连接:https://leetcode-cn.com/problems/4sum/ 解题思路 此处撰写解题思路 第一层循环 从0-->n-3 去掉重复 if(i>0 && nums[i]==nums[i-1])continue; 如果当前元素和后三个元素之和大于target直接break if(nums[i]+nums[i+1]+nums[i+2]+nums[i+...

Coding_Physical的专栏 335
上一篇: 恩格玛密码机的工作原理
下一篇: 编程之美 3.9 重建二叉树 扩展问题
Cainell
博客等级 码龄9年 23粉丝 96原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值