【优选算法】——双指针——15. 三数之和

目录

 1.题目

2.解法(排序+双指针):

算法思路:

 3.代码实现


 1.题目





15. 三数之和

提示

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != 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

2.解法(排序+双指针):


算法思路:


本题与两数之和类似,是⾮常经典的⾯试题。

与两数之和稍微不同的是,题⽬中要求找到所有「不重复」的三元组。那我们可以利⽤在两数之和
那⾥⽤的双指针思想:
【优选算法】——Leetcode——LCR 179. 查找总价格为目标值的两个商品-CSDN博客

i. 先排序;
ii. 然后固定⼀个数 a
iii. 在这个数后⾯的区间内,使⽤「双指针算法」快速找到两个数之和等于 -a 即可。
但是要注意的是,这道题⾥⾯需要有「去重」操作
i. 找到⼀个结果之后, left 和 right 指针要「跳过重复」的元素;
ii. 当使⽤完⼀次双指针算法之后,固定的 a 也要「跳过重复」的元素。

 3.代码实现

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--;}}// 去重 ii++;while (i < n && nums[i] == nums[i - 1])i++;}return ret;}
};

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

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

相关文章

Clickhouse判断是否在范围中

isIPAddressInRange a表 name range id ------- 美国 ‘172.10.1.1/24’ 1 b表 ip name 172.10.11.2 test 现在去判断b表中的test是在哪个范围 isIPAddressInRange(a.ip, b.range) 判断是否为IPv4还是IPv6 isIPv4String isIPv6String 转换IP toIPv4 toIPv4OrDefault(s…

RT-Thread移植到STM32F407

1、获取RT-Thread源码 首先到rtthread官网下载rt-thread nano后解压 解压后打开后内容如下。 2、系统结构 各文件夹的作用如下&#xff1a; Rt-Thread-nano源码结构 文件夹描述bsp板级支持包components/finshRT-Thread组件docs文档信息include头文件libcpu/arm与arm处理器相…

根文件系统的其他测试

文章目录 一、hello测试程序编写二、程序后台运行1.在后台运行方法2.中文显示测试3.开机自动启动测试 一、hello测试程序编写 &#x1f4a6;我们使用 Linux 的目的就是运行我们自己的软件&#xff0c;我们编译的应用软件一般都使用动态库&#xff0c;使用动态库的话应用软件体…

vue 钩子函数updated什么时候触发

触发时机 updated是Vue生命周期钩子函数之一&#xff0c;在组件的数据变化导致虚拟DOM重新渲染并应用到实际DOM之后触发。具体来说&#xff0c;updated会在以下几种情况下被触发&#xff1a; 初始渲染完成后&#xff1a;当组件首次渲染完成并将虚拟DOM渲染到实际DOM之后&#…

获取两个时间之间的月份

工具类 public static List<String> getMonthBetweenDate(Date startDate, Date endDate) {ArrayList<String> result new ArrayList<String>();SimpleDateFormat sdf new SimpleDateFormat("yyyy.MM");//格式化&#xff0c;调整为自己需要的格…

摩菲Murphy显示器显示表 总线编程器维修PV780B

Murphy仪器维修包括&#xff1a;摩菲数字显示器&#xff1b;摩菲监视仪表&#xff1b;摩菲CAN总线控制器等维修 维修故障包括&#xff1a;黑屏、指示灯无显示&#xff0c;触摸屏上电无反应&#xff0c; 上电蓝屏、白屏&#xff0c;通电几分钟后屏幕变为蓝屏&#xff0c;主板故…

班级综合测评|基于Springboot+vue的班级综合测评管理系统(源码+数据库+文档)

目录 基于Springbootvue的“智慧食堂”系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

应用系统集成企业微信的技术方案和最佳实践

本文以springbootvue技术开发的低代码平台为案例&#xff0c;介绍应用系统如何集成企业微信&#xff0c;包括同步企业微信组织用户、单点登录、消息发送等。 在线体验&#xff1a;http://www.yunchengxc.com 1、准备应用 1.1、注册企业微信账号 作为企业微信的企业管理员&a…

铅离子/镉离子绿色荧光探针,具有高特异性高灵敏度

基本信息&#xff1a; 中文名称&#xff1a;铅离子/镉离子绿色荧光探针 英文名称&#xff1a;Leadmium TM Green AM dye 外观&#xff1a;固体或粉末状 规格&#xff1a;10mg、25mg、50mg (可支持定制&#xff09; 纯度&#xff1a;95% 储存条件&#xff1a;-20C避光避湿…

46. UE5 RPG 增加角色受击反馈

在前面的文章中&#xff0c;我们实现了对敌人的属性的初始化&#xff0c;现在敌人也拥有的自己的属性值&#xff0c;技能击中敌人后&#xff0c;也能够实现血量的减少。 现在还需要的就是在技能击中敌人后&#xff0c;需要敌人进行一些击中反馈&#xff0c;比如敌人被技能击中后…

JVM中类加载过程中如何验证文件格式

在JVM中&#xff0c;类加载过程中的验证阶段主要是为了确保加载的Class文件是符合虚拟机规定的Class文件格式&#xff0c;并且没有安全方面的问题。验证阶段主要包括四个部分&#xff1a;文件格式验证、元数据验证、字节码验证和符号引用验证。 关于文件格式验证&#xff0c;这…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-10.1-NXP SDK 移植

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

夸克网盘拉新怎么做?分享网盘拉新攻略!

夸克网盘拉新怎么做&#xff1f;如何通过推广夸克网盘来赚佣金&#xff1f;相信大家应该都使用过夸克网盘&#xff0c;现在夸克网盘的拉新赚佣金活动开展的如火如荼&#xff0c;不少朋友通过夸克网盘拉新赚取收益&#xff0c;真的很香。还有一部分想要赚佣金但是不知道如何操作…

C语言例题39、输入一个正整数,将其反方向逆序输出

#include <stdio.h>void main() {int x;int ge; //个位int result 0;printf("请输入一个正整数&#xff1a;");scanf("%d", &x);while (x > 0) {//解题原理ge x % 10;//每次分解取得个位的数字result result * 10 ge;//个十百千万顺序向左…

给数据库贴标签

要给数据库中的文本贴标签&#xff0c;你需要创建一个新的表格来存储标签&#xff0c;并且与文本表进行关联。以下是一个示例的口语化的创建表格和查询示例&#xff1a; 创建标签表格&#xff1a; CREATE TABLE IF NOT EXISTS labels (标签ID INTEGER PRIMARY KEY,标签名称 T…

libcity 笔记:添加自定义dataset

假设我们把libcity/data/dataset/trajectory_dataset.py复制一份到libcity/data/dataset/dataset_subclass/GeolifeDM_dataset.py&#xff0c;里面内容不变&#xff0c;只是把class的名字换了 那其他需要修改哪些内容&#xff0c;使得这个dataset生效呢 libcity/data/dataset/d…

Python应用:让生活更智能

随着科技的进步&#xff0c;Python已成为一种非常受欢迎的编程语言&#xff0c;它在数据分析、人工智能、Web开发等领域有着广泛的应用。今天&#xff0c;我们将探讨一个Python应用的例子&#xff0c;这个应用将帮助我们更智能地管理日常生活。 应用名称&#xff1a;智能生活助…

福建 | 福建铭发用行动诠释“敢为天下先”的泉州精神

福建铭发 泉州TOP级企业 在福建&#xff0c;提到混凝土搅拌站&#xff0c;铭发是绕不开的一个存在。 他们是当地最早一批建成的商砼企业&#xff0c;也是如今发展规模最大的TOP级企业。 从2007年建站至今&#xff0c;近15年的发展&#xff0c;他们形成了一套铭发特色的企业经…

数据结构与算法|算法总结|滑动窗口篇

之前在用golang二刷代码随想录的时候&#xff0c;遇到209.长度最小的子数组竟然没想到应该用滑动窗口解题&#xff01;怒而猛刷&#xff0c;并结合各个博客和视频总结滑动窗口题型和模板如下 参考资料&#xff1a; 【精心总结滑动窗口代码模板, 直接搞定80道Leetcode算法题】 【…

根据token获取了username后,能否在其他地方使用这个获取的username,或者在其他地方如何获取username?

当然可以在其他地方使用获取到的用户名。一旦你从token中获取到用户名&#xff0c;你可以将其存储在能够在整个应用程序中访问的地方。 在你的代码中&#xff0c;你从token中获取用户名的地方是这里&#xff1a; String username getUsernameFromToken(token);在这行之后&am…