【专题刷题】双指针(三):两数之和,三数之和,四数之和
📝前言说明:
- 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
- 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
- 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽
视频
- 167. 两数之和 II
- 个人解
- 优质解
- 15. 三数之和
- 个人解
- 优质解
- 18. 四数之和
- 个人解
- 优质解
167. 两数之和 II
个人解
思路:
暴力求解的时间复杂度:O($n^2$)
,每次移动只能获取一个信息,移动 n 2 n^2 n2 次,才能得到所有两数相加的结果。
那使用双指针呢?
使用双指针,利用数组的非递减性(也就是非严格单调递增性)
我们让一个指针指向左边最小的元素,一个指针指向右边最大的元素
要寻找numbers[left] + numbers[right] == target
,
以numbers[left] + numbers[right] > target
的时候为例,让right--
,移动一次得到n个信息,因为当最小数和numbers[right]
相加都大于target
了,那其他numbers[left]
之后更大的数与numbers[right]
相加就没有意义了,一下可以排除n个数。left++
也同理
用时:3:00
屎山代码:
class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int left = 1, right = numbers.size();while(left < right){int sum = numbers[left - 1] + numbers[right - 1];if(sum < target)left++;else if(sum > target)right--;elsereturn {left, right};}return {-1,-1};}
};
时间复杂度:O(n)
空间复杂度:O(1)
优质解
简单题简单做,双指针已够用
15. 三数之和
个人解
思路:用base
遍历整个数组,作为基准,将问题转换成nums[left] + nums[right] = 0 - nums[base]
的问题。然后基于这个标准(nums[left] + nums[right] = 0 - nums[base]
),再利用数组的单调性,再次用双指针。
用时:20:00(为什么这么长,因为题目要求不能重复,被去重坑惨了)
屎山代码:
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {ranges::sort(nums);int n = nums.size(), base = 0;vector<vector<int>> ans;for(; base < n - 2; base++){int left = base + 1, right = n - 1;while(left < right){if(nums[base] + nums[left] + nums[right] < 0)left++;else if(nums[base] + nums[left] + nums[right] > 0)right--;else{ans.push_back({nums[base], nums[left], nums[right]});while(left < right && nums[left + 1] == nums[left])left++;while(left < right && nums[right - 1] == nums[right])right--;left++;right--;}}while(base < n - 3 && nums[base + 1] == nums[base])base++;}return ans;}
};
时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)
优质解
思路:双指针已经够用
但是我们来欣赏一下别人处理重复元素的思路,以及其他优化,和优雅的代码
代码(来自Leetcode上灵茶山艾府):
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {ranges::sort(nums);vector<vector<int>> ans;int n = nums.size();for (int i = 0; i < n - 2; i++) {int x = nums[i];// 跳过重复数字,base在使用前确保是唯一的,数组中无重复if (i && x == nums[i - 1]) continue; // 优化一(加上两个最小数)if (x + nums[i + 1] + nums[i + 2] > 0) break; // 优化二(加上两个最大数)if (x + nums[n - 2] + nums[n - 1] < 0) continue; int j = i + 1, k = n - 1;while (j < k) {int s = x + nums[j] + nums[k];if (s > 0) {k--;} else if (s < 0) {j++;} else { // 三数之和为 0ans.push_back({x, nums[j], nums[k]});// 跳过重复数字(用 for 可以多跳一步,直接跳到不相等的下一个元素)for (j++; j < k && nums[j] == nums[j - 1]; j++); for (k--; k > j && nums[k] == nums[k + 1]; k--);}}}return ans;}
};
18. 四数之和
个人解
思路:借助三数之和的解决方法,定好一个base
以后又转换成三数之和的问题。
不过这时候优化的地方有两个,因为其实可以看做是有两个base
用时:19:00
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {ranges::sort(nums);vector<vector<int>> ans;int n = nums.size();for(int base = 0; base < n - 3; base++){ // 错误示范:应该要先用完再去除,因为万一其他数用的和base一样呢?// if(base < n - 4 && nums[base + 1] == nums[base])// continue; // 去除重复元素if(base && nums[base] == nums[base - 1])continue;long long x = nums[base]; // 这题老六 数字会溢出if(x + nums[base + 1] + nums[base + 2] + nums[base + 3] > target)break;if(x + nums[n - 3] + nums[n - 2] + nums[n - 1] < target) continue;for(int i = base + 1; i < n - 2; i++){if(i > base + 1 && nums[i] == nums[i - 1])continue;long long y = nums[i];if(x + y + nums[i + 1] + nums[i + 2] > target)break;if(x + y + nums[n - 2] + nums[n - 1] < target) continue;int j = i + 1, k = n - 1;while(j < k){if(x + y + nums[j] + nums[k] < target)j++;else if(x + y + nums[j] + nums[k] > target)k--;else{ans.push_back({(int)x, (int)y, nums[j], nums[k]});for(j++; j < k && nums[j] == nums[j - 1]; j++);for(k--; j < k && nums[k] == nums[k + 1]; k--);}}}}return ans;}
};
时间复杂度:O( n 3 n^3 n3)
空间复杂度:O(1)
注意跳过重复元素:必须是用完以后base
再跳过重复元素,因为有可能后面的数可能取和base
一样的值,但是被base
跳过了就取不到了。
优质解
双指针已足以,暂时不探索其他解
🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!
相关文章:
【专题刷题】双指针(三):两数之和,三数之和,四数之和
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
Java八种常见的设计模式
一、单例模式 单例模式是(Singleton Pattern)Java中最常用的设计模式之一,它保证一个类仅有一个实例,并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化,以防止外部直接通过构造函数创建实例。同时&am…...
用Prompt 技术【提示词】打造自己的大语言智能体
机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力,以便能够按照人类的指令执行任务,为机器提供一些范例作为参考,使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”,透过精心设计的…...
灵鉴 AI五大核心能力洞穿 “数据黑箱”云取证深度支持8大核心应用
本文关键词:灵鉴AI 、电子数据取证分析AI助手、云取证、DeepSeek大模型 1.灵鉴AI ,V1.0深度融合DeepSeek大模型技术,破解行业痛点,5大核心能力,让大模型真正“懂”电子数据分析。 2.LX-A216云取证系统,V2.…...
了解高速设计的信号完整性仿真
高速设计需要精确的信号传输,以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真,您可以及早发现并解决这些挑战。这种主动方法有助于…...
用 Deepseek 写的html油耗计算器
在油价高企的今天,了解自己爱车的真实油耗情况对每位车主来说都至关重要。本文将介绍一个简单实用的油耗计算方法,并提供一个可以直接使用的HTML油耗计算器。 为什么要计算油耗? 计算油耗不仅能帮助我们: 了解车辆的真实燃油经济…...
SAP系统青果糖无法报工
问题:班长说工单号4100000101青果糖工单 无法报工 原因排查:工单4100000101的工艺路线版本错误,选了版本1的,版本1是委外的工艺,本厂生产应该选版本2. 解决: 1:重读主数据,更改工单4100000101的工艺路线版本. 2:工单成品已交库,不能直接更改工…...
GPU 招投标全流程分析与总结
GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…...
Centos7.6安装JDK 1.8教程
前提:先把jdk1.8文件上传到usr/local目录下,文件名如:jdk-8u151-linux-x64.tar.gz 1. 解压 JDK 压缩包 假设 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目录下。 进入 /usr/local 目录: cd /usr/local 解压文件&#…...
Golang errors 包快速上手
文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...
新型多机器人协作运输系统,轻松应对复杂路面
受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发,研究人员开发了多机器人协作运输系统(Multirobot Cooperative Transportation Systems,MRCTS)运输单个机器人无法处理的重型超大物体,可用于搜救行动、灾难响应、军事…...
易境通国际货代系统:如何解决货代物流行业的棘手难题
国际货代行业作为全球贸易的重要纽带,面临着日益复杂的市场环境和客户需求。然而,随着业务规模的扩张和多变的市场需求,传统的粗放式管理模式逐渐暴露出效率低下、成本失控、风险难控等问题。尤其在跨境电商高速发展的背景下,货代…...
基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期,国际信息和学术交流也不断加强,计算机技术对经济社会发展和人民生活改善的影响也日益突出,人类的生存和思考方式也产生了变化。传统医药连锁店管理采取了人工的管理方法&…...
Vue 3 reactive 和 ref 区别及 失去响应性问题
在 Vue 3 中,reactive 和 ref 是实现响应式数据的两个核心 API,它们的设计目标和使用场景有所不同。以下是两者的详细对比: 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理(对象、数组、Map 等)…...
d3.js绘制单/多面板组合箱线图
用d3.js研发了个可以单面板、多面板展示的组合箱线图; 组合箱线图中包括普通散点、蜂群散点、小提琴图、小提琴箱线图、柱状图、误差棒、离群点等等,其中大部分你能想到的配置都是自行传参调整的,你想不到的也能稍作修改然后自行调整&#x…...
第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统
一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...
IDEA使用jclasslib Bytecode Viewer查看jvm字节码
学习jvm的时候,想查看字节码和局部变量表,可以使用idea安装jclasslib Bytecode View插件查看。 (1)安装工具: 安装完成后需要重启idea. (2)准备一段代码,编译运行 package com.te…...
list.
列表类型是用来存储多个有序的字符串,列表中的每个字符串称为元素(element),⼀个列表最多可以存储个元素 在 Redis 中,可以对列表两端插入(push)和弹出(pop),…...
202520读书笔记|《我要按自己喜欢的方式去生活》——面对可能到来的裁员,那就等正式通知吧
《我要按自己喜欢的方式去生活》作者宝夏夏,很赞的一本书,通透真实,不矫揉造作,直击内心。 因为第一个故事,裁员而进来的。早晨睡眼惺忪醒来,闺蜜半夜发来一大段话,大意是公司在缩减成本裁员&am…...
Linux 文件传输:系统数据交互的动脉
前言:sshd 在Linux系统中,文件传输常依赖于SSH协议(Secure Shell),而sshd(OpenSSH Daemon)是负责处理SSH连接的后台服务程序。通过sshd,用户可以在加密的通道中进行安全的远程登录、…...
Rust + WebAssembly 生产部署指南
1 最小可行部署(MVP) 前端打包wasm-pack build --target web --release # 生成 .wasm JS 包装器 npm run build / vite build / webpack … # 打包 HTML/CSS/JS 资源拷贝产物 到生产服务器的站点目录dist/ ├── index.html ├── pkg…...
git忽略已跟踪的文件/指定文件
在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...
基于Django实现的图书分析大屏系统项目
图书分析大屏展示系统项目大纲与启动教程 一、项目概述 图书分析大屏展示系统是一个基于Django框架开发的Web应用,主要用于图书数据的可视化分析与展示。该系统采用MVT(Model-View-Template)架构模式,结合MySQL数据库࿰…...
【OSCP-vulnhub】GoldenEye
目录 端口扫描 查找源代码 目录扫描 POP3邮件枚举 1.先枚举用户名 2.hydra爆破 3.nc连接 boris: natalya: 设置本地hosts文件 doak: 解析图片 exiftool for-007.jpg strings for-007.jpg 使用MSF去搜索内核版本 漏洞利用 ---…...
OpenAI发布GPT-4.1系列模型,主打编程能力提升
OpenAI在本周一推出了全新一代模型家族——GPT-4.1系列。没错,就是“4.1”,尽管OpenAI的命名方式已经让人有些摸不着头脑。 这一系列包括三个型号:GPT-4.1、GPT-4.1 mini和GPT-4.1 nano。据OpenAI介绍,这些模型在编程任务和指令遵…...
压缩包网页预览(zip-html-preview)
zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...
OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为: dst ( I ) 0.114 ∗ src ( I ) . B…...
影视产业链中的律师角色以及合规风控要点
影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中,律师服务贯穿项目全生命周期,涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作:剧本委托创作、改编、版权…...
Java工具类——实体类列表写入excel
Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...
C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning
文章目录 1. #elifdef 和 #elifndef:更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码: 1.3 编译器支持 2. #warning:发出编译警告2.1 背景与动机2.2 语法与示例示例代码: 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...
书写API文档的最佳实践[特殊字符]
API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验,加速采用,并培养强大的开发者社区。反之,糟糕的文档可能导致困惑、挫败感和错误,从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...
【Maven】手动安装依赖到本地仓库
【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖,中央仓库地址:https://mvnrepository.com/ 搜搜你的依赖的a…...
kali下maven 的安装与配置
1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置,由于解压时我们没有指定路径&#x…...
list的模拟实现和反向迭代器的底层
1:list的模拟实现 1:链表的节点 对于list的模拟实现,我们需要先定义一个节点的类可以使用(class也可以使用struct) // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...
OpenHarmony - 小型系统内核(LiteOS-A)(七)
OpenHarmony - 小型系统内核(LiteOS-A)(七) 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层,其实就是指实现VFS层定义的若干接口函数,可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...
四层板的时钟线设计:关键要点与实用策略
在电子电路设计领域,四层板凭借其出色的电气性能和合理的空间布局,广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”,为整个电路提供同步信号,其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此,深入探…...
【TypeScript类型系统解析:一次真实的类型检查修复经历】
TypeScript类型系统解析:一次真实的类型检查修复经历 在最近的管理系统开发过程中,我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题,我更深入地理解了TypeScript的类型系统工作原理,以及如何在Vue项目中正确处理…...
全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位
传统的护理工作中,护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别,定时对患者进行巡视,并手工填写巡视记录表,登记巡视时间、人员等信息。月末时,还需进行人工数据统计,这一过程不仅效率低…...
初识Redis · 命令、数据结构补充、协议
目录 前言: 数据结构补充 stream geospaital Hyperloglog bitmap bitfield 渐进式遍历命令等 认识Redis客户端及协议 前言: 在前文,我们总览一下,我们已经介绍了什么是Redis,Redis的应用场景是什么ÿ…...
DBA工作常见问题整理
MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一,它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现: 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...
云转型(cloud transformation)——不仅仅是简单的基础设施迁移
李升伟 编译 云转型不仅仅是迁移基础设施,更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性,并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容: 🔄 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…...
SpringBoot 定时任务
启用定时任务 首先确定需要启用定时任务的SpringBoot类,然后添加注解(EnableScheduling)以启用定时任务 package com.mt.visitorauth.anjian.service;import org.springframework.scheduling.annotation.EnableScheduling;EnableScheduli…...
常见的低代码策略整理
低代码策略通过简化开发流程、降低技术门槛、提升效率,帮助用户快速构建灵活可靠的应用。这些策略的核心优势体现在以下方面: 快速交付与降本增效 减少编码需求:通过可视化配置(如变量替换、表达式函数)替代传统编码…...
HFSS(李明洋)学习记录1
Hfss操作记录 HFSS—solution type:选择求解类型Modeler—units:设置hfss内部的基本单位可选mm或者in(英寸)设置端口激励—波端口:右键selection model/face 选中对应的表面之后;右键assign excitation/po…...
泛目录站群技术架构演进观察:2025年PHP+Java混合方案实战笔记
https://www.zhanqun.xin/ 在参与某跨国电商平台SEO优化项目时,我们团队对市面上主流站群系统进行了为期半年的技术评估。最终选择部署的2025版无极多功能泛目录站群程序,其技术实现路径与工程化设计思路颇具参考价值,现整理关键发现如下。 …...
sentinel安装部署及测试--实践
一、什么是 Sentinel? Sentinel 是阿里巴巴开源的一款用于微服务流量控制和系统防护的中间件。它的主要功能包括: **流量控制(Flow Control):**限制系统的 QPS 或线程数,防止因流量过大导致系统崩溃。 **…...
Yocto项目实战教程 · 第4章:4.1小节元数据
🔍 B站相应的视频教程: 📌 Yocto项目实战教程-第4章-4.1小节-元数据 记得三连,标为原始粉丝。 在嵌入式Linux系统构建中,Yocto项目凭借其高度模块化、可配置的特性成为主流工具。而其背后的关键支撑之一,便…...
应用镜像是什么?轻量应用服务器的镜像大全
应用镜像是轻量应用服务器专属的,镜像就是轻量应用服务器的装机盘,应用镜像在原有的纯净版操作系统上集成了应用程序,例如WordPress应用镜像、宝塔面板应用镜像、WooCommerce等应用,阿里云服务器网aliyunfuwuqi.com整理什么是轻量…...
关于Java集合中对象字段的不同排序实现方式
📊 关于Java集合中对象字段的不同排序实现方式 #Java集合 #排序算法 #Comparator #性能优化 一、排序基础:两种核心方式对比 方式Comparable接口Comparator接口实现位置目标类内部实现独立类或匿名内部类排序逻辑自然排序(固定规则…...
2000-2017年各省发电量数据
2000-2017年各省发电量数据 1、时间:2000-2017年 2、来源:能源年鉴、国家统计局 3、指标:行政区划代码、城市、年份、发电量 4、范围:31省 5、指标说明:发电量是指在特定时间内,发电设备(如…...