1.8 双指针专题:四数之和
1.题目链接
18. 四数之和 - 力扣(LeetCode)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 * -109 <= nums[i] <= 109 * -109 <= target <= 109https://leetcode.cn/problems/4sum/
2.题目描述
给你⼀个由 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
- -109 <= nums[i] <= 109
- -109 <= target <= 109
3.算法思路
这段代码通过 排序 + 双指针法 解决了四数之和问题,核心思想是将四数之和转化为两数之和问题。以下是具体设计思路:
1. 排序预处理
首先对数组进行排序,目的有两点:
去重:排序后相同元素会相邻,方便后续跳过重复值。
双指针优化:有序数组可以通过双指针快速缩小搜索范围。
2. 分层固定 + 双指针搜索
外层循环固定前两个数:用
i
和j
分别遍历第一个和第二个数。
剪枝:
i
的范围是[0, n-3)
,j
的范围是[i+1, n-2)
,确保后续至少有两个数可选。内层双指针搜索后两个数:用
left
和right
在剩余区间[j+1, n-1]
内寻找满足条件的组合。
计算
remain = target - nums[i] - nums[j]
,转化为两数之和问题。双指针根据当前和与
remain
的大小关系移动,缩小搜索范围:
sum > remain
→right--
(需要更小的值)。
sum < remain
→left++
(需要更大的值)。
sum == remain
→ 记录结果并去重。
3. 去重策略
- 外层循环去重:跳过
i
和j
的重复值,避免重复解。while (i < n - 3 && nums[i] == nums[i - 1]) i++; // i去重 while (j < n - 2 && nums[j] == nums[j - 1]) j++; // j去重
- 内层双指针去重:找到解后跳过
left
和right
的重复值。while (left < right && nums[left] == nums[left - 1]) left++; // left去重 while (left < right && nums[right] == nums[right + 1]) right--; // right去重
对比维度 | 双指针法(优化后) | 暴力枚举法 |
---|---|---|
时间复杂度 | O(n³)(两层循环+双指针遍历) | O(n⁴)(四层循环遍历所有组合) |
空间复杂度 | O(1)(除结果存储外无额外空间) | O(1) |
去重实现 | 通过排序和指针跳跃自动去重,逻辑清晰 | 需额外哈希表去重,实现复杂 |
适用场景 | 处理大规模数据(如 n=1000) | 仅适用于极小规模数据(如 n=10) |
剪枝优化 | 通过排序提前终止无效搜索(如剩余数过大/过小) | 无优化,遍历所有可能组合 |
4.关键优化点
双指针替代两层循环:将后两数的遍历从 O(n²) 优化为 O(n)。
去重剪枝:通过排序和指针跳跃避免重复解,减少无效计算。
提前终止:在有序数组中,若当前最小和已大于目标值,可直接跳出循环。
5.总结
该算法通过 排序预处理 和 双指针法,将四数之和问题的时间复杂度从暴力法的 O(n⁴) 优化到 O(n³),同时结合去重策略保证了结果的唯一性。相较暴力法,它在处理大规模数据时效率显著提升。
4.代码实现
class Solution
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(), nums.end());vector<vector<int>> arr;int length = nums.size();for (int i = 0; i < length - 3;) {for (int j = i + 1; j < length - 2;) {// 转化为:两数之和等于remain 问题long long remain =(long long)target - nums[i] - nums[j],sum = 0;int left = j + 1, right = length - 1;while (left < right) {sum = nums[left] + nums[right];if (sum > remain) right--;else if (sum <remain) left++;else {arr.push_back({nums[i], nums[j], nums[left], nums[right]});left++, right--;// [left,right]去重while (left < right && nums[left] == nums[left - 1]) left++;while (left < right && nums[right] == nums[right + 1]) right--;}}j++;// j 去重while(j < length && nums[j] == nums[j - 1]) j++;}i++;// i 去重while(i < length && nums[i] == nums[i - 1]) i++;}return arr;}
};
相关文章:
1.8 双指针专题:四数之和
1.题目链接 18. 四数之和 - 力扣(LeetCode)18. 四数之和 - 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元…...
基于用户标签和协同过滤混合算法的商城推荐系统设计与实现
一、研究背景 随着电子商务的快速发展,用户面对海量商品时往往面临“信息过载”问题。传统的推荐算法(如协同过滤)在用户行为数据稀疏或新用户场景下存在冷启动、推荐多样性不足等缺陷。 现状与挑战: 协同过滤:依赖用…...
软件版本号设计
软件版本号的设计是软件开发中的重要环节,它不仅帮助开发团队管理代码,还能让用户清楚地了解软件的更新状态。以下是常见的版本号设计方法和最佳实践,供你参考: 1. 常见的版本号设计规范 语义化版本控制(Semantic Ver…...
ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展
今天向大家介绍的这篇文章题目为:“Protein−Peptide Docking with ESMFold Language Model”,近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略,评估其在预测蛋白质-肽相互作用方面的性能&a…...
【项目】负载均衡式在线OJ
负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍: 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...
Android启动速度优化
Android启动速度优化 一、应用启动基础知识 1.1 启动类型 Android应用的启动类型主要分为三种: 冷启动(Cold Start):应用进程不存在,系统需要创建新的进程,加载并启动应用。这是最耗时的启动方式。 温启动(Warm Start):应用进程存在,但Activity可能被销毁,需要重新创…...
python爬虫碰到IP被封的情况,如何解决?
在数据抓取和爬虫开发的实践中,Python作为一种功能强大且易于上手的编程语言,被广泛应用于网络数据的采集。然而,随着网络环境的日益复杂,爬虫活动也面临着越来越多的挑战,其中IP被封便是常见且棘手的问题。IP被封不仅…...
Web网页制作(静态网页):千年之恋
一、是用的PyCharm来写的代码 二、代码中所用到的知识点(无 js) 这段HTML代码展示了一个简单的注册页面,包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面,包含了常见的HTML元素和表单控件。通过CSS样…...
mac安装mysql之后报错zsh: command not found: mysql !
在Mac上安装MySQL后,如果终端中找不到mysql命令,通常是 因为MySQL的命令行工具(如mysql客户端)没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...
Spring Boot 启动失败:Failed to start bean ‘documentationPluginsBootstrapper’ 解决方案
文章目录 1. 问题描述 🎯2. 可能原因分析 🔍原因 1:SpringFox 版本与 Spring Boot 版本不兼容 ❌✅ 解决方案:添加兼容性配置(首选!!!!) 原因 2:S…...
Python Cookbook-3.16 查看汇率
任务 想周期性地(用 crontab 或者 Windows计划任务来运行某 Python 脚本)从 Web 获取数据,监视某两种货币之间的兑换比例,并在两者之间的汇率达到某个值时发送提醒邮件。 解决方案 这个任务和一系列的从 Web 获取数据的监控任务很类似,它们…...
Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策
一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些,DeepSeek是知识型大脑,Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力,例如撰写论文、润…...
Redis存数据就像存钱:RDB定期存款 vs AOF实时记账
Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...
【从零开始学习计算机科学】编译原理(一)编译过程概述
【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...
第十八:go 并发 goroutine
channel 可以让多个goroutine 之间实现通信 Add方法调用时机:必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add,可能会导致Wait方法提前返回,因为计数器没有正确反映正在运行的goroutine的数量…...
基于QGIS的二次开发(四):矢量编辑与属性表操作
一、实验目的 本次实验续接上一次的实验内容,旨在通过设计与开发地理信息系统的过程,加深学生对地理信息系统的理解,并掌握相关的设计与开发技能,包括熟悉地理信息系统的设计与开发流程,加强对 MVC 软件设计模式的理解…...
AI日报 - 2025年3月13日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | Reka开源21B参数推理模型Flash 3,推出企业智能平台Nexus 🔬 模型采用RLOO方法结合模型与规则基础奖励,实现高效推理 ▎💼 商业动向 | Waymo在…...
lua C语言api学习1 编译第一个程序
本文开始进行lua C语言api的学习 1 简介 lua语言与C语言使用还是很紧密,以前我只是学习lua语言比较多,C语言api部分了解比较少,最近在学习tcc编译器的使用进一步学习一下lua C语言api的使用。 2 配置编译环境 首先需配置好tcc编译器环境[参考],再配置好lua源码路径[参考],新…...
【物联网-WIFI】
物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-...
在MATLAB中实现PID控制仿真
在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例: 方法1:使用MATLAB脚本编程(基于控制系统工具箱) 步骤1:定义被控对象的数学模型 假设被控对象是…...
C#实现本地Deepseek模型及其他模型的对话v1.4
前言 系 统:Window11 开发工具:Visual Studio 2022 相关技术:C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModelÿ…...
用sphinx-doc整理文档#2
上一篇博客:用sphinx-doc整理文档 回头看,上一篇博客已经是18年的事情了。最近我又开始维护起18年的项目了。最近策划同事提了一些需求。我又改进了一波,所以有本文。 sphinx支持导出pdf sphinx本身是支持导出pdf的,命令如下&am…...
DBeaver部分操作指南(数据库连接,构造ERD图,格式化SQL)
详细步骤指导如何使用DBeaver来连接到数据库: 步骤 1: 下载并安装 DBeaver 如果还没有安装DBeaver,请访问DBeaver官网下载适合操作系统的版本,并按照指示完成安装。 步骤 2: 启动 DBeaver 安装完成后,启动DBeaver应用程序。 …...
十种处理权重矩阵的方法及数学公式
1. 权重归一化(Weight Normalization) 目的:通过分离权重向量的范数和方向来加速训练。公式:对于权重向量 w \mathbf{w} w,归一化后的权重 w ′ \mathbf{w} w′ 为: w ′ w ∥ w ∥ \mathbf{w} \frac{…...
姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗
《仁心俱乐部》在芒果 TV 播出,湖南卫视金鹰独播剧场也随之播出,这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜,她为患者检查身体时动作娴熟,与患者沟通时展现出的耐心和专注,都展现出很高的专业…...
postgresql源码安装
步骤 1: 安装依赖 在开始之前,请确保您的系统上安装了编译 PostgreSQL 所需的依赖包。使用以下命令安装必要的软件包: 对于 Debian/Ubuntu 系统: sudo apt update sudo apt install build-essential libreadline-dev zlib1g-dev flex biso…...
【51单片机】程序实验15.DS18B20温度传感器
主要参考学习资料:B站【普中官方】51单片机手把手教学视频 开发资料下载链接:http://www.prechin.cn/gongsixinwen/208.html 单片机套装:普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…...
Java 集合框架:数据管理的强大工具
Java集合框架:数据管理的强大工具 目录 Java集合框架:数据管理的强大工具引言一、Set集合1. 定义与特点2. 常用实现类 - HashSet创建方式常用方法遍历方式 二、Map集合1. 定义与特点2. 常用实现类 - HashMap创建方式常用方法遍历方式 三、List集合1. 定义…...
AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静
在现代工业生产中,电力系统的稳定性和安全性至关重要。电力系统的绝缘状况直接关系到设备的正常运行和人员的安全。为了确保IT配电系统(不接地系统)的绝缘状况始终处于好的状态,安科瑞电气股份有限公司推出了AIM-T500绝缘监测仪&a…...
css3-学习
css 特性 选择器 基础选择器 标签选择器 ID 选择器 类选择器 CSS 的优先级是什么? !important > 内联样式(style“”) > ID 选择器 > 类选择器 属性选择器 伪类 > 标签选择器 伪元素选择器。 层级选择器 foo bar 后代选择器,元素的…...
neo4j图数据库
neo4j图数据库 学习neo4j图数据库的使用 文章目录 neo4j图数据库[toc]1-核心知识点2-思路整理3-参考网址4-上手实操1-安装neo4j-docker2-要学习CQL语句3-解决cmake问题1-可能的原因及解决办法1. cmake 未正确安装或者版本不兼容2. 依赖库缺失3. 环境变量配置问题4. 网络问题 2-…...
go下的Prototype学习笔记
本博文讲解prototype的学习笔记,内容包含了syntax、option go_package、message、service进行讲解,举例了常见写法。 文章目录 1.syntax 声明语法版本2.package 给当前的proto分配包名称3.option4.message4.1 切片数组4.2 map4.3 类型嵌套 5. 消息定义 …...
[高阶技术了解]WebRPC详解
“webrpc详解”,我需要根据我搜索到的资料来回答这个问题。首先,得弄清楚webrpc到底是什么。根据,Webrpc是一个模式驱动的后端服务开发工具,允许通过RIDL或JSON模式文件生成代码,支持多种语言如Go、TypeScript等。它类…...
地基注解@Controller和@RestController区别
前记:基础啊,区别点重点理解; 在Spring和Spring Boot框架中,Controller和RestController都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明: 1. 核心区别 特性C…...
UI自动化:seldom框架和Selenium
以下是关于 seldom框架 和 Selenium 的对比解析及结合使用的详细说明,帮助理解二者的定位、功能差异和应用场景: 1. 核心定位 工具定位Selenium浏览器自动化工具库,提供直接操控浏览器的底层API(如点击、输入、获取元素等&#x…...
机器学习项目实战——信用评分与贷款风险评估(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 信用评分与贷款风险评估是金融领域中的一个重要应用场景。随着金融科技的快速发展,银行、信用卡公司、P2P…...
使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型
介绍 在本文中,我们将检查这些敏感性分析的结果,并构建一个健壮的元模型,作为优化过程的基础。 本文涵盖: 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 (MOP)使用预后系数…...
【科研绘图系列】python绘制分组点图(grouped dot plot)
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…...
【Android】adb shell基本使用教程
adb shell 是 Android Debug Bridge (ADB) 工具中的一个命令,用于在连接的 Android 设备或模拟器上执行 shell 命令。通过 adb shell,你可以直接与设备的 Linux 内核交互,执行各种操作。 基本用法 启动 adb shell: 在终端或命令提…...
257. 二叉树的所有路径(递归+回溯)
257. 二叉树的所有路径 力扣题目链接(opens new window) 给定一个二叉树,返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 思路:在叶子节点收割结果,如果不是叶子节点,则依次处理左右子树&a…...
C++和标准库速成(一)——HelloWorld和名称空间
目录 1. 引言1. 简单小程序"Hello World"1.1 模块导入1.2 预处理指令1.2.1 简介1.2.2 常用的预处理指令 1.3 main()函数1.4 输入输出流1.4.1 输出流1.4.2 转义字符1.4.3 输入流 2. 名称空间2.1 定义名称空间2.2 using指令2.3 嵌套名称空间2.4 名称空间别名 参考 1. 引…...
OpenHarmony 5.0 MP4封装的H265视频播放失败的解决方案
问题现象 OpenHarmony 5.0版本使用AVPlayer播放MP4封装格式的H.265(HEVC)编码格式的视频时解码失败导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎,因为 libav_codec_hevc_parser.z.so 动态库未开源导致从MP4封装中分离的HVCC格式的…...
索引-最左匹配
在数据库索引中,最左匹配原则确实在遇到某些范围查询时会停止向右匹配,但对于 >、<、BETWEEN 和前缀匹配的 LIKE,索引匹配可以继续使用后续列。以下是详细分析: 1. 最左匹配原则的核心规则 最左匹配原则要求查询条件从复合…...
感觉自己邮电部诗人
中心扩散 第二次做这道题,求回文子串最大长度的时候,计算写成了j-i1,看了15分钟才看发现哪里出了问题,感觉自己邮电部诗人,望周知。...
Java代理方式的详细介绍,包括代码示例、注释说明及其差异对比表格
Java代理方式 Java中的代理模式是一种结构型设计模式,用于在不修改原始类的情况下增强其功能。Java支持两种代理方式: 静态代理动态代理 JDK动态代理CGLIB动态代理 1. 静态代理 静态代理通过手动编写代理类实现,代理类和目标类实现相同的…...
接口对外安全交互新姿势
文章目录 1.前言2.姿势2.1 AES2.2 body参数签名及验签2.3使用sm2 加ip白名单 3.总结 1.前言 由于这久做了一个乐企数电开票的项目,已经上线了,真的是一言难尽,再回首已经是轻舟已过万重山,接口通过外网暴露给业务方使用࿰…...
Docker基础篇——Ubuntu下Docker安装
大家好我是木木,在当今快速发展的云计算与云原生时代,容器化技术蓬勃兴起,Docker 作为实现容器化的主流工具之一,为开发者和运维人员带来了极大的便捷 。下面我们一起进行Docker安装。 Docker的官方Ubuntu安装文档,如…...
《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》
在科技飞速发展的今天,量子计算与经典算法的融合成为了前沿领域的焦点。DeepSeek-M8的“量子神经网络混合架构”,宛如一把钥匙,开启了经典算法与量子计算协同推理的全新大门,为诸多复杂问题的解决提供了前所未有的思路。 量子计算…...
关于C/C++语言的初学者在哪刷题,怎么刷题
引言: 这篇博客主要是针对初学者关于怎么在网上刷题,以及在哪里刷题。 1.介绍平台(在哪刷题): 1.牛客牛客网https://www.nowcoder.com/ :有许多面试题,也有许多供学习者练习的题 2.洛谷洛谷 …...
【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX
文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串,value 的类型是存在差异的 二进制存储 Redis 中的字符串,直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据,还可…...