【双指针】三数之和

三数之和

在做这道题之前,建议建议先将两数之和做完再做,提升更大~

文章目录

  • 三数之和
    • 题目描述
    • 算法原理
      • 解法一
      • 解法二
        • 思路如下:
        • 处理细节问题:
    • 代码编写
      • Java代码编写
      • C++代码编写

15. 三数之和 - 力扣(LeetCode)

题目描述

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

解法二

排序+双指针

思路如下:
  1. 首先先排序

  2. 固定一个数字a(图中我们将第一个数作为aa<=0

  3. a的后面的区间中,利用双指针算法快速找到两个数的和等于-a即可

    双指针

    • 首先在a后面的区间中的两侧的数中分别定义left right两个指针
    • 这里关于left right的移动在下面这篇博客中有详细讲解,可以先移步学习之后再来做这道题~
处理细节问题:
  1. 去重(要避免越界
    • 找到一种结果的时候,left right指针都要跳过重复的元素
    • 当使用完一次双指针之后,i也需要跳过重复的元素
  2. 不漏
    • 在区间中寻找到一种结果之后,不能停止,继续缩小区间寻找,直至区间寻找完全。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

代码编写

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;}
};

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

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

相关文章

knife4j集合化postman

knife4j集合化postman 01 knife4j的介绍 基于 JavaMVC的集成框架swagger的进一步强化&#xff0c;在原有通过注释就能生成文档的前身swagger-bootstrap-ui之上&#xff0c;增加了postman的测试功能&#xff0c;优化了文档的UI界面&#xff0c;在测试api接口的方面有了极大的进…

C#学习系列相关之数组(一)---数组的定义与使用

一、数组定义与初始化 数组是数据的集合。标量变量一次只能保存一项。数组可以容纳多个项目。这些项目称为数组的元素。数组存储相同数据类型的数据。每个元素都可以通过索引来引用。数组是从零开始的。第一个元素的索引为零。数组是引用类型。 数组用于存储我们应用程序的数据…

香橙派5 RK3588 yolov5模型转换rknn及部署踩坑全记录 orangepi 5

零、写在前面 由于距离写这篇文章过去很久&#xff0c;有的部分&#xff0c;官方已更新&#xff0c;请多结合其他人的看&#xff0c;并多琢磨、讨论~ 另外打个小广告&#xff1a;博客 https://blog.vrxiaojie.top/ 欢迎大家前来做客玩耍&#xff0c;提出问题~~ 以后的文章都会…

笔记(三)maxflow push relabel与图像分割

笔记&#xff08;三&#xff09;maxflow push relabel与图像分割 1. Push-Relabel算法思想2.Push-Relabel算法原理示意图3.Push-Relabel算法具体实例4. push relabel与图割 1. Push-Relabel算法思想 对于一个网络流图: 该算法直观可以这样理解&#xff0c;先在源节点处加入充足…

Linux 内存管理中的 Buffers 和 Cached:理解和区分

引言 当涉及到 Linux 系统的内存管理时&#xff0c;“Buffers” 和 “Cached” 是两个经常会引起混淆的术语。这两个概念都代表了系统内存的一部分&#xff0c;但它们的作用和工作方式有所不同。 区别&#xff1a; Buffers&#xff1a; Buffers&#xff08;缓冲区&#xff0…

【经验分享】开发问题记录总结(持续更新)

目录 工具开发 界面类继承某自定义界面类时&#xff0c;出现布局混乱或者所有控件集中在左上角&#xff1f; 在继承自定义界面之后&#xff0c;以诸如 on_xxx_clicked() 模式设计的槽函数失效了? 使用pugi接口取出文本数据后&#xff0c;为什么该变量无法进行字符串比较&…

Flask WTForms 表单插件的使用

在Web应用中&#xff0c;表单处理是一个基本而常见的任务。Python的WTForms库通过提供表单的结构、验证和渲染等功能&#xff0c;简化了表单的处理流程。与此同时&#xff0c;Flask的扩展Flask-WTF更进一步地整合了WTForms&#xff0c;为开发者提供了更便捷、灵活的表单处理方式…

【STM32单片机】简易计算器设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器&#xff0c;使用动态数码管模块、矩阵按键、蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;数码管默认显示0&#xff0c;输入对应的操作数进行四则运…

Echarts 设备状态 甘特图

在做工厂智能化生产看板时&#xff0c;绝对会有设备状态看板&#xff0c;展示设备当天或者当前状态&#xff0c;设备状态数据一般是有mes 系统设备管理模块对设备信息进行采集&#xff0c;一般包括过站数据&#xff0c;设备当前状态&#xff0c;是否在线是否故障、检修、待生产…

Python与设计模式--装饰器模式

6-Python与设计模式–装饰器模式 一、快餐点餐系统 又提到了那个快餐点餐系统&#xff0c;不过今天我们只以其中的一个类作为主角&#xff1a;饮料类。 首先&#xff0c;回忆下饮料类&#xff1a; class Beverage():name ""price 0.0type "BEVERAGE"…

【计算机网络笔记】多路访问控制(MAC)协议——轮转访问MAC协议

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

树状数组 / pbds解法 E2. Array Optimization by Deque

Problem - 1579E2 - Codeforces Array Optimization by Deque - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 树状数组解法 将 a i a_i ai​插入到队头&#xff0c;贡献为&#xff1a;原队列中所有比 a i a_i ai​小的数的数量将 a i a_i ai​插入到队尾&#xff0c;贡献为&a…

TS常见类型概述

基元类型 string、number、boolean null和undefined // 当用到null和undefined跟其他类型的联合类型时&#xff0c;多要进行一个非空的类型缩小方式 // 当开发者知道变量不会是null和undefined时&#xff0c;可以用!断言它非空 function fn(x) {return x!.toFixed }biginit、…

极客时间:使用本地小型语言模型运行网页浏览器应用程序。

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

二进制编辑器hexedit的安装及使用

Hexedit 同时以 ASCII 和十六进制显示文件 安装 终端输入hexedit回车&#xff0c;如果没安装&#xff0c;会提示让输入 sudo apt-get install hexedit 照着输入命令&#xff0c;安装。安装完成后&#xff0c;cd到一个有二进制文件的目录下&#xff0c;输入hexedit命令回车 再…

C语言第三十三弹---交换变量(不使用临时变量)

C语言在不使用临时变量的情况下实现变量交换 思路&#xff1a;看见交换变量&#xff0c;那么最容易考虑到的就是使用临时变量交换。如果不允许使用临时变量那么该如何考虑呢&#xff1f;使用^异或位运算(二进制位相同为0 不同为1)&#xff0c;通过利用异或运算的特性可以完成交…

集线器-交换机-路由器

1.集线器(Hub) 集线器就是将网线集中到一起的机器&#xff0c;也就是多台主机和设备的连接器。集线器的主要功能是对接收到的信号进行同步整形放大&#xff0c;以扩大网络的传输距离&#xff0c;是中继器的一种形式&#xff0c;区别在于集线器能够提供多端口服务&#xff0c;也…

从0开始学习JavaScript--构建强大的JavaScript图片库

在现代Web开发中&#xff0c;图像是不可或缺的一部分&#xff0c;而构建一个强大的JavaScript图片库能够有效地管理、展示和操作图像&#xff0c;为用户提供更丰富的视觉体验。本文将深入探讨构建JavaScript图片库的实用技巧&#xff0c;并通过丰富的示例代码演示如何实现各种功…

透过对话聊天聊网络tcp三次握手四次挥手

序 说起来网络&#xff0c;就让我想起的就是一张图。我在网上可以为所欲为&#xff0c;反正你又不能顺着网线来打我。接下来我们来详细说一下网络到底是怎么连接的。 TCP三次打招呼 首先我会用男女生之间的聊天方式&#xff0c;来举一个例子。 从tcp三次握手来说&#xff0c;…

RISCV汇编与Linux内核传参

在全志RISCV/D1设备上安装汇编器和链接器 去年笔者将openwrt-22.03系统移植到了基于全志D1/riscv64的嵌入式设备上。当时发现系统启动后&#xff0c;网络不可用&#xff1b;简单地修改/etc/config/network设备即可以正常连接有线网络。为了学习riscv ISA&#xff0c;笔者手动为…