【双指针】三数之和
三数之和
在做这道题之前,建议建议先将两数之和做完再做,提升更大~
文章目录
- 三数之和
- 题目描述
- 算法原理
- 解法一
- 解法二
- 思路如下:
- 处理细节问题:
- 代码编写
- Java代码编写
- C++代码编写
15. 三数之和 - 力扣(LeetCode)
题目描述
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请
你返回所有和为 0 且不重复的三元组。
**注意:**答案中不可以包含重复的三元组。
示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
解释:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。
示例 2:
输入:nums = [0,1,1]
输出:[]
解释:唯一可能的三元组和不为 0 。
示例 3:
输入:nums = [0,0,0]
输出:[[0,0,0]]
解释:唯一可能的三元组和为 0 。
提示:
3 <= nums.length <= 3000-105 <= nums[i] <= 105
算法原理
解法一
排序+暴力枚举+利用set去重
时间复杂度O(N^3)
解法二
排序+双指针
思路如下:
-
首先先排序
-
固定一个数字
a(图中我们将第一个数作为a)a<=0 -
在
a的后面的区间中,利用双指针算法快速找到两个数的和等于-a即可双指针
- 首先在
a后面的区间中的两侧的数中分别定义left right两个指针 - 这里关于
left right的移动在下面这篇博客中有详细讲解,可以先移步学习之后再来做这道题~
- 首先在
处理细节问题:
- 去重(要避免越界)
- 找到一种结果的时候,
left right指针都要跳过重复的元素 - 当使用完一次双指针之后,
i也需要跳过重复的元素
- 找到一种结果的时候,
- 不漏
- 在区间中寻找到一种结果之后,不能停止,继续缩小区间寻找,直至区间寻找完全。

代码编写
Java代码编写
class Solution {public List<List<Integer>> threeSum(int[] nums) {// 建立一个线性表存储答案List<List<Integer>> ret = new ArrayList<>();// 1. 排序Arrays.sort(nums);// 2. 双指针解决问题int n = nums.length;// 固定数 afor(int i = 0; i < n; ){// 双指针int left = i + 1, right = n - 1, target = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum > target) right--;else if(sum < target) left++;else{ret.add(new ArrayList<Integer>(Arrays.asList(nums[i], nums[left], nums[right])));// 在最小区间继续寻找left++; right--;// 去重: left、 rightwhile(left < right && nums[left] == nums[left - 1])left++;while(left < right && nums[right] == nums[right + 1])right--;}}// 去重 ii++;while(i < n && nums[i] == nums[i - 1])i++;}return ret;}
}
C++代码编写
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;// 1. 排序sort(nums.begin(), nums.end());// 2. 利⽤双指针解决问题int n = nums.size();for (int i = 0; i < n; ) // 固定数 a{if (nums[i] > 0) break; // ⼩优化int left = i + 1, right = n - 1, target = -nums[i];while (left < right){int sum = nums[left] + nums[right];if (sum > target) right--;else if (sum < target) left++;else{ret.push_back({ nums[i], nums[left], nums[right] });left++, right--;// 去重操作 left 和 rightwhile (left < right && nums[left] == nums[left - 1]) left++;while (left < right && nums[right] == nums[right + 1])right--;}}// 去重 i i++;while (i < n && nums[i] == nums[i - 1]) i++;}return ret;}
};
相关文章:
【双指针】三数之和
三数之和 在做这道题之前,建议建议先将两数之和做完再做,提升更大~ 文章目录 三数之和题目描述算法原理解法一解法二思路如下:处理细节问题: 代码编写Java代码编写C代码编写 15. 三数之和 - 力扣(LeetCode࿰…...
CH01_适应设计模式
Iterator模式(迭代器模式) 迭代器模式(Iterator),提供一种方法,顺序访问一个聚合对象中各个元素,而不是暴露该对象的内部表示。 类图结构 说明 Iterator(迭代器) 该角色负责定义按…...
电机工作制
电机工作制 1.什么是电机工作制2.电机工作制的分类 最近在做电机控制器,看到很多电机铭牌上写着工作制:S*,有S1,有S2,查了一下,学习一下是什么意思。 1.什么是电机工作制 根据GBT 755-2019《旋转电机定额…...
qt国际化多语言
vs + qt 方法 一 (1)生成.pro文件 如果报错: cannot find any qt projects to export 则执行如下: 然后重新生成 pro文件。 (2)生成ts文件 (方法1)在项目文件(xxx.pro) 文件添加: TRANSLATIONS += en.ts zh_CN.ts 然后打开cmd命令,进入项目目录,执行 l…...
Java Excel Poi 单元格内置的数据格式
位置 //在类 org.apache.poi.ss.usermodel.BuiltinFormats 中的私有成员变量_formats中 private static final String[] _formats new String[]{"General", "0", "0.00", "#,##0", "#,##0.00", "\"$\"#,##…...
【深入剖析K8s】容器技术基础(三):深入理解容器镜像 文件角度
容器里的进程‘看到’’的文件系统 可能你立刻就能想到,这应该是一个关于MountNamespace的问题:容器里的应用进程理应‘看到”一套完全独立的文件系统这样它就可以在自己的容器目录(比如 /tmp)下进行操作’而完全不会受宿主机以及其他容器的影响。 容器…...
竞赛选题 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测
文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…...
开源WIFI继电器之源代码
源代码:WiFiRelay: 基于ESP8285的WiFi继电器代码 1、环境搭建 开发环境搭建请参照win10搭建ESP8266_RTOS_SDK编译环境_xtensa-lx106 下载-CSDN博客 2、下载代码 在sdk路径下创建一个projects的文件夹,将WiFiRelay的代码克隆到此目录下: mkdir projec…...
NX二次开发UF_CURVE_create_arc_point_point_radius 函数介绍
文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_point_radius Defined in: uf_curve.h int UF_CURVE_create_arc_point_point_radius(tag_t point1, tag_t point2, double radius, UF_CURVE_limit_p_t l…...
Unsupervised MVS论文笔记(2019年)
Unsupervised MVS论文笔记(2019年) 摘要1 引言2 相关工作3 实现方法3.1 网络架构3.2 通过光度一致性学习3.3 MVS的鲁棒光度一致性3.4 学习设置和实施的细节3.5.预测每幅图像的深度图 4 实验4.1 在DTU上的结果4.2 消融实验4.3 在ETH3D数据集上的微调4.4 在…...
2-Python与设计模式--前言
0-Python与设计模式–前言 一 什么是设计模式 设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验, 考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言, 它是一种解决问题的思…...
如何判别使用的junit是4还是5
Junit4与Junit5的版本中,Test注解的包位置不同。 Junit4的Test注解是在org.junit包下,儿Junit5的Test注解是在org.junit.jupiter.api包下。 可据此判定是使用的Junit4还是Junit5。 Junit4 import org.junit.Test;Junit5 import org.junit.jupiter.api…...
C#-创建用于测试的父类StartupBase用于服务注入
当写完C#代码,需要对某个方法进行测试。 创建一个XXXTests.cs文件之后,发现需要注入某个服务怎么办? 再创建一个StartupBase.cs文件: public abstract class StartupBase {public IConfiguration Configuration { get; }public …...
JMeter之压力测试——混合场景并发
在实际的压力测试场景中,有时会遇到多个场景混合并发的情况,这时就需要设置不同的并发比例对不同场景请求数量的控制,下面提供两种方案。 一、多线程组方案 1.业务场景设计如下:场景A、场景B、场景C,三个场景按照并发…...
Python入门04字符串
目录 1 字符串的定义2 转义字符3 字符串的常见方法4 分割字符串5 字符串反转6 字符串的链式调用7 格式化字符串8 多行字符串总结 1 字符串的定义 在Python中,字符串表示一个字符的序列,比如 str "hello,world"这里我们定义了一个字符串&…...
vue3(四)-基础入门之 fetch 与 axios
一、fetch 1、axios和fetch的区别 Axios 和 Fetch 都是 JavaScript 中用于发送 HTTP 请求的 API,它们的主要区别在以下方面: 1.Axios 支持更广泛的浏览器和 Node.js 版本,而 Fetch 只能在较新的浏览器中使用,或需要使用 polyfi…...
2016年五一杯数学建模C题二孩政策问题解题全过程文档及程序
2016年五一杯数学建模 C题 二孩政策问题 原题再现 多年来实施的严、紧计划生育政策对控制人口增长起到关键作用。在优生优育政策的指引下,我国人口质量显著提高,但也带来了不利影响,生育率偏低、男女比例失衡、人口老龄化情况严重等问题。2…...
学习c#的第二十四天
目录 C# 事件(Event) 事件概述 如何订阅和取消订阅事件 以编程方式订阅事件 使用匿名函数订阅事件 取消订阅 如何发布符合 .NET 准则的事件 发布基于 EventHandler 模式的事件 如何在派生类中引发基类事件 如何实现接口事件 如何实现自定义事…...
ELK企业级日志分析平台——logstash
部署 新建一台虚拟机elk4部署logstash [rootelk4 ~]# yum install -y jdk-11.0.15_linux-x64_bin.rpm[rootelk4 ~]# yum install -y logstash-7.6.1.rpm 命令方式 [rootelk4 bin]# /usr/share/logstash/bin/logstash -e input { stdin { } } output { stdout {} } elasticsearc…...
laravel8中常用路由使用(笔记四)
目录 1、框架路由目录统一放该目录 2、基本路由,路由都调用Route方法 3、控制器使用路由 4、路由参数 5、路由组 6、命名路由 7、命令查看当前路由列表 8、路由缓存 在Laravel 8中,路由定义了应用程序中接受请求的方式。它们定义了URL和相应的控制器方法之间的…...
效率飞跃:基于快马ai定制openclaw在ubuntu上的高级自动化部署方案
最近在Ubuntu上部署OpenClaw时,发现手动配置实在太费时间了。作为一个经常需要部署各种开源工具的开发老鸟,我决定探索一套自动化方案来提升效率。经过反复实践,终于总结出一套高效的部署流程,现在分享给大家。 自动化部署方案设…...
PostgreSQL 初体验
PostgreSQL 安装一、核心基础1. 简介PostgreSQL 是开源对象关系型数据库(ORDBMS),源自加州伯克利分校,兼容 SQL 标准,支持事务、复杂查询与扩展。2. 核心特点完全开源,许可宽松高度符合 SQL 标准࿰…...
D模型生成:从二维图像重建三维结构
从二维图像重建三维结构:D模型的革命性突破 在计算机视觉和人工智能领域,从二维图像重建三维结构一直是一项极具挑战性的任务。传统的三维建模方法依赖多视角图像或深度传感器,而近年来,基于深度学习的D模型(如Diffus…...
ComfyUI-VideoHelperSuite视频工作流技术指南:从基础操作到专业应用
ComfyUI-VideoHelperSuite视频工作流技术指南:从基础操作到专业应用 【免费下载链接】ComfyUI-VideoHelperSuite Nodes related to video workflows 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-VideoHelperSuite 引言:视频处理工作流的…...
别只比功能了!从社区生态和未来路线图,聊聊Spring AI和LangChain4j谁更值得押注
从社区生态与战略布局看Spring AI与LangChain4j的长期价值 当技术决策者面对两个功能相近的开源项目时,功能对比表格往往只是决策的起点。真正决定技术选型成败的,是项目背后的社区活力、维护模式与长期演进路线。Spring AI与LangChain4j作为Java生态中两…...
Inspeckage实战案例:移动应用安全测试的10个关键场景
Inspeckage实战案例:移动应用安全测试的10个关键场景 【免费下载链接】Inspeckage Android Package Inspector - dynamic analysis with api hooks, start unexported activities and more. (Xposed Module) 项目地址: https://gitcode.com/gh_mirrors/in/Inspeck…...
第6章 数据类型转换-6.6 转换为元组
通过使用tuple()函数可以将字符串、列表或集合转换为元组。其语法格式如下:tuple([x])其中,参数x为可选参数,表示字符串、列表或集合,如果省略该参数,则该函数返回空元组。示例代码如下:# 资源包\Code\chap…...
免费在Windows 10上安装Android子系统的完整指南
免费在Windows 10上安装Android子系统的完整指南 【免费下载链接】WSA-Windows-10 This is a backport of Windows Subsystem for Android to Windows 10. 项目地址: https://gitcode.com/gh_mirrors/ws/WSA-Windows-10 想在Windows 10电脑上直接运行手机应用和游戏吗&…...
拆解 OpenHands(8)--- CodeActAgent
在 OpenHands 智能框架的生态中,CodeActAgent 占据着核心地位,它是基于 CodeAct 理念构建的核心代理模块。其设计初衷极具巧思:将各类复杂任务统一转化为 “代码执行” 的形式来完成,同时兼顾自然语言对话的交互特性。这一设计既保…...
ai开发ai:借助快马平台智能体辅助完成openclaw千问模型的深度配置与优化
最近在折腾OpenClaw配置千问模型的项目,发现整个过程特别适合用AI来辅助开发。这种"用AI开发AI应用"的循环特别有意思,今天就来分享下我的实践心得。 核心配置脚本的AI协作开发 配置OpenClaw最头疼的就是那些复杂的错误处理逻辑。我直接在In…...
