【LeetCode】四数之和 - 指南

news/2026/1/25 17:58:29/文章来源:https://www.cnblogs.com/gccbuaa/p/19530213

文章目录

  • 前言
  • 题目描述
  • 算法原理
  • 代码实现


前言

道友们,今天咱们来做四数之和!


题目链接:18.四数之和

题目描述

给你一个由 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

你可以按 任意顺序 返回答案 。

示例 1:

输入: nums = [1,0,-1,0,-2,2], target = 0
输出: [[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入: nums = [2,2,2,2,2], target = 8
输出: [[2,2,2,2]]

提示:

1 <= nums.length <= 200
-10^9 <= nums[i] <= 10^9
-10^9 <= target <=10^9

算法原理

这道题跟我们做的上一道题很类似,只不过要更复杂一点,但是做法是相同的。
首先我们对数组排序,方便我们后续去重和使用双指针算法,以示例 1 为例:

在这里插入图片描述

排完序之后,固定最左边的元素,在它的右区间找三个数,使这三个数的和与我们固定的数再相加结果为 target,我们可以看到,在右区间找三个数的过程就是我们上次做的那道三数之和的问题,如果没看过的道友可以去看一下。

这里去重操作我们依然有两种写法,即用 set 去重、自己手动去重,这道题的代码逻辑和三数之和几乎一模一样,包括在越界等细节方面的处理,如果三数之和那道题会做了,那这道题是很简单的。

总体上,四数之和这道题就是在三数之和的基础上多套了一层!

代码实现

用set去重

class Solution
{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target){int n = nums.size();sort(nums.begin(), nums.end());set<vector<int>> s;for (int i = 0; i < n - 3; ++i){for (int j = i + 1; j < n - 2; ++j){long long int tag = (long long)target - nums[i] - nums[j];int left = j + 1, right = n - 1;while (left < right){if (nums[left] + nums[right] < tag){left++;}else if(nums[left] + nums[right] > tag){right--;}else{s.insert({nums[i], nums[j], nums[left], nums[right]});left++;right--;}}}}vector<vector<int>> v;for (auto& e : s){v.push_back(e);}return v;}};

自己手动去重

class Solution
{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target){int n = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> v;for (int i = 0; i < n - 3;){for (int j = i + 1; j < n - 2;){long long int tag = (long long int)target - nums[i] - nums[j];int left = j + 1, right = n - 1;while (left < right){if (nums[left] + nums[right] < tag){left++;}else if(nums[left] + nums[right] > tag){right--;}else{v.push_back({nums[i], nums[j], nums[left], nums[right]});left++;right--;while(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}++j;while(j < n - 2 && nums[j] == nums[j - 1]) ++j;}++i;while(i < n - 3 && nums[i] == nums[i - 1]) ++i;}return v;}};

这里有一个要注意的点,我们在一个区间找目标值的时候要先计算出我们要找的目标值,如果我们把目标值的类型定义为 int 的话,在一些用例中是会越界的,这里我们可以用 long long来存一下。

long long int tag = (long long int)target - nums[i] - nums[j];

要注意左边的变量也要强转一下,三个变量里面强转任意一个都行,因为剩下的两个会发生算数转换。


完!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1215330.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我在哪儿-- 照片定位查看助手

我在哪儿-- 照片定位查看助手我在哪儿-- 照片定位查看助手 功能:查看图片和缩略图 自动提取图片GPS信息 自动显示地理位置信息 在百度地图、高德地图和谷歌地图中查看位置使用说明:文件菜单:打开图片: 选择单个图片文件…

2026年企业AI获客必看:GEO服务商选型权威指南

随着生成式AI的全面普及,用户信息获取方式正经历历史性迁移。截至2026年初,国内主流AI平台日活跃用户已突破5000万,其中DeepSeek DAU超2000万,豆包MAU近6000万。据艾瑞咨询预测,2026年AI搜索将承接30%以上的商业查…

LoRA微调target module设置

目录原则1️⃣ 注意力 Q/K/V2️⃣ FFN(前馈层)target modules 最佳组合Q/V + 顶层 2~4 层 FFN 配置一、先给你一个“能直接用”的结论版本(以 Qwen / LLaMA 系结构为例)1️⃣ Q / V 的 target modules(必选)2️…

Claude Skills 保姆级教程:无脑照做就能用出效果

大家好,我是六哥。 Claude Skills 我也是上周一才知道有这么个东西,具体是什么完全没概念,想想还是自己知道的太晚了。 但说实话,这玩意成功的引起了我的好奇心,所以就有了这篇文章! 没有所谓的方法论和废话,下…

人工智能之核心技术 深度学习 第一章 神经网络基础

人工智能之核心技术 深度学习 第一章 神经网络基础—公式关注公众号 文章目录 人工智能之核心技术 深度学习一、感知器模型1.1 线性感知器&#xff08;Perceptron&#xff09;1.2 多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09; 二、激活函数常见激活函数对比…

慢充3.3kW占20%,普通7kW占50%,快充11kW占20%,超充20kW占10

基于蒙特卡洛思想生成10000台充电汽车充电负荷曲线充电汽车负荷预测这事挺有意思的。咱们今天直接上干货&#xff0c;用蒙特卡洛方法撸出一万辆车子的充电曲线。别被名字吓到&#xff0c;说白了就是靠大量随机采样模拟真实场景——就像在赌场扔骰子&#xff0c;次数多了总能逼近…

2026年青少年心理辅导优选名单,口碑机构来助力,家庭教育指导/叛逆孩子教育/青少年心理咨询,青少年心理辅导学校排名

近年来,青少年心理健康问题日益凸显,厌学、叛逆、沉迷网络、抑郁焦虑等现象频发,引发社会广泛关注。据《2024年中国青少年心理健康蓝皮书》显示,我国青少年抑郁风险检出率达24.1%,亲子关系紧张、家庭教育缺失成为…

完整教程:目前流行的前端框架

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

电力市场出清程序。 IEEE14节点考虑输电阻塞,求解机组边际电价和节点边际电价。 采用拉格朗...

电力市场出清程序。 IEEE14节点考虑输电阻塞&#xff0c;求解机组边际电价和节点边际电价。 采用拉格朗日乘子进行分析计算&#xff0c;目标函数为发电成本最小。 运用matlab中的linprog&#xff08;&#xff09;函数实现此程序&#xff0c;均为m程序。 其他测试系统完全可以根…

单北斗GNSS在桥梁和地质灾害变形监测中的应用与发展

本文将阐述单北斗GNSS在桥梁和地质灾害变形监测中的多重应用&#xff0c;深入解析其工作原理及系统安装过程。同时&#xff0c;文章还将探讨如何选择合适的单北斗变形监测厂家与设备&#xff0c;以保证项目的成功实施。此外&#xff0c;针对GNSS与单北斗在变形监测中的性能对比…

【LeetCode】91. 解码方法 - 教程

【LeetCode】91. 解码方法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&q…

2026 主流GEO服务商全景图谱,企业GEO服务商选型指南

《2026年To B企业AI获客必看:GEO机制深度解析与服务商权威选型指南》 随着生成式AI全面渗透用户信息获取路径,GEO(Generative Engine Optimization,生成引擎优化)已成为To B企业不可忽视的新增长引擎。据艾瑞咨询…

三相与两相步进方案的矢量控制及超前角控制:内置微控制器的技术解析

三相&#xff0c;两相步进方案&#xff0c;矢量控制&#xff0c;超前角控制&#xff0c;内置微控制器&#xff01; 最近在搞步进电机控制方案选型&#xff0c;发现三相和两相系统的选择特别有意思。两种方案看似差不多&#xff0c;实际调起来完全是两个世界。今天咱们直接上干…

光伏储能交直流微电网matlab/simulink仿真,风光储能联合发电系统simulink仿...

光伏储能交直流微电网matlab/simulink仿真&#xff0c;风光储能联合发电系统simulink仿真&#xff0c;光伏风电储能能量管理&#xff0c;光伏风电混合发电系统储能系统并网最近在搞微电网仿真的时候&#xff0c;发现风光储联合系统的参数协调真是让人头秃。特别是当光伏阵列和双…

双亲表示法构造树-----Java实现

package Data_Structure.Tree; import java.io.IOException; import java.util.NoSuchElementException; import java.util.Scanner; //双亲表示法构造树,该树使用层序进行构造,通过parent下标索引双亲结点 public c…

KiCad V10新特性前瞻

https://forum.kicad.info/t/post-v9-new-features-and-development-news/58848 KiCad采用年度发布周期&#xff0c;主版本通常在每年2月至3月间发布。虽然正式版尚未推出&#xff0c;但由于KiCad始终秉持开源理念&#xff08;这恰是其最大优势&#xff09;&#xff0c;开发者…

基于传统材料力学势能法的健康齿轮时变啮合刚度数值分析

一、核心结论 传统材料力学势能法是计算健康齿轮时变啮合刚度的经典方法&#xff0c;通过将轮齿简化为变截面悬臂梁&#xff0c;考虑弯曲、剪切、轴向压缩、赫兹接触及基体变形等能量分量&#xff0c;能够准确反映齿轮啮合过程中的刚度变化。该方法具有计算效率高、精度满足工…

电气设计的隐藏外挂:1:1元器件图库实战

电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小电气高低压成套元器件 几乎每个厂家的元器件都画出来了尺寸大小型号都有&#xff0c;应有尽有&#xff0c;全部1:1尺寸&#xff0c;直接标注就OK配电柜设计现场最要命的场景&#xff1a;左手抓着某厂家的断路器样本…

Product Hunt 每日热榜 | 2026-01-25

1. Humans in the Loop 标语&#xff1a;一个免费的社区&#xff0c;专门讨论与代理编程与人工智能相关的所有事。 介绍&#xff1a;“有人的参与”是一个为热爱利用人工智能加速工作的伙伴们打造的地方。这里是一个免费的社区&#xff0c;大家可以在这里分享关于Claude Code…

构建 OpenHarmony 跨设备任务协同中心:Flutter 实现多端任务流转与状态同步

一、引言&#xff1a;从单设备到分布式协同 OpenHarmony 的核心愿景之一是 “超级终端” —— 多个物理设备无缝协同&#xff0c;形成一个逻辑上的统一工作空间。例如&#xff1a; 在手机上开始编辑文档&#xff0c;走到平板前自动续写&#xff1b;车机导航途中&#xff0c;到家…