day7-三数之和

三数之和

力扣题目链接(opens new window)

给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意: 答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为: [ [-1, 0, 1], [-1, -1, 2] ]

思路

这道题可以说是噩梦的开始,我们的平常思路是:通过哈希表,用三层循环寻找符合要求的解,同时每一层循环都要进行一次去重,繁琐无比。

可以使用双指针法求解。

思路如下:

首先对数组进行一个从小到大排序

定义三个指针

  • cur:按顺序指向当前位置
  • left:初始位置为cur的洗一个位置
  • right:初始位置为数组最末尾位置

由于事先排序过,因此当cur指针所指数值大于0时,直接返回res。(要求三数之和=0)

这里要对cur进行一个去重。

去重思路:当cur与cur-1的值相等时,说明已经用过了,因此直接continue

代码为if(nums[cur] == nums[cur -1 ])return res;

为什么这里是cur-1而不是+1呢?举个例子就可以理解,由于我们left是在cur的后一位,如果与+1比较,则是与left比较,这部分的意义便成为判断三数里的两个数是否相等。这不符合我们的要求。因此我们应该去前一位,由于cur从0开始,我们应该再加一个判断条件:if(cur >0 && nums[cur] == nums[cur -1 ])return res;

left、right寻找目标值

循环条件为while(left < right),为何不能加上等于号?加上等于号就变成两个数了,不符合要求。

我们在循环里做了两件事

第一件是判断当前三数之和是否大于0/小于0/等于0,若大于0,则right–,小于同理,指针往后移动一位。

若是=0

这里意味着找到了一组答案,将其收进res数组。

接下来对letf、right进行去重。

代码如下:

while(left < right && nums[right] == nums[right - 1])right--;
while(left < right && nums[left] == nums[left + 1])left++;

原理如上,最后记得再往前一位。

代码如下:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());int left,right;vector<vector<int>> res;for(int i =0;i<nums.size();i++){if(nums[i] > 0)return res;if(i > 0 && nums[i] == nums[i-1])continue;left = i+1;right = nums.size()-1;while(left < right){if(nums[i] + nums[left] + nums[right] > 0)right--;else if(nums[i] + nums[left] + nums[right] < 0)left++;else{res.push_back(vector<int>{nums[i],nums[left],nums[right]});while(left < right && nums[left] == nums[left+1])left++;while(left < right && nums[right] == nums[right-1])right--;// 双指针收束left++;right--;}} }return res;}
};

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

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

相关文章

Appium python 框架

目录 前言 流程 结构 具体说说 run.py 思路 其他模块 前言 Appium是一个开源的移动应用自动化测试框架&#xff0c;它允许开发人员使用多种编程语言&#xff08;包括Python&#xff09;来编写自动化测试脚本。Appium框架提供了一套API和工具&#xff0c;可以与移动设备进…

基于单片机语音识别智能家居系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;液晶显示当前环境温湿度&#xff0c;用电器开关状态通过语音模块识别设定的语音&#xff1b;DHT11进行环境温湿度采集&#xff1b;通过语音播报模块报当前温湿度&#xff0c;智能回复通过语音识别可以打开灯&#xff0c;窗帘&am…

C语言-排序,初识指针

目录 【1】冒泡排序&#xff08;从小到大&#xff09; 【2】选择排序 【3】二维数组 【4】指针 【5】指针修饰 【6】大小端 【7】初见二级指针 练习&#xff1a; 【1】冒泡排序&#xff08;从小到大&#xff09; #include <stdio.h> //数组哪里的\0?自己和字符串…

Flink 在新能源场站运维的应用

摘要&#xff1a;本文整理自中南电力设计院工程师、注册测绘师姚远&#xff0c;在 Flink Forward Asia 2022 行业案例专场的分享。本篇内容主要分为四个部分&#xff1a; 建设背景 技术架构 应用落地 后续及其他 点击查看原文视频 & 演讲PPT 一、建设背景 建设背景主要…

Yalmip入门教程(3)-约束条件的定义

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 之前的博客简单介绍了约束条件的定义方法&#xff0c;接下来将对其进行详细介绍。 首先简单复习一下&#xff1a; 1.定义约束条件可以使用矩阵拼接…

GRE和MGRE

目录 GRE GRE环境的搭建 MGRE MGRE的配置 MGRE环境下的RIP网络 MGRE实验 VPN 说到GRE&#xff0c;我们先来说个大家熟悉一点的&#xff0c;那就是VPN技术。 背景需求 企业、组织、商家等对专用网有强大的需求。 高性能、高速度和高安全性是专用网明显的优势。 物理专…

Notepad++ 配置python虚拟环境(Anaconda)

Notepad配置python运行环境步骤&#xff1a; 打开Notepad ->”运行”菜单->”运行”按钮在弹出的窗口内输入以下命令&#xff1a; 我的conda中存在虚拟环境 (1) base (2) pytorch_gpu 添加base环境至Notepad中 cmd /k chdir /d $(CURRENT_DIRECTORY) & call cond…

TX Barcode .NET for WPF Crack

TX Barcode .NET for WPF Crack 用于WPF软件的TX Barcode.NET包括一天完成的功能以及用于WPF的软件的2D条形码控制。 用于WPF的TX Barcode.NET的功能和属性&#xff1a; 它具有以下特性和属性&#xff0c;如&#xff1a; 常见的文字处理功能&#xff1a;它可以为用户和开发人员…

Spark和Hive概念

Spark介绍&#xff1a; Spark是一个开源的分布式数据处理引擎&#xff0c;最初由加州大学伯克利分校的AMPLab开发。它被设计用来处理大规模数据集&#xff0c;提供快速、通用、易用的数据处理框架。Spark能够在内存中快速处理数据&#xff0c;支持多种数据源&#xff0c;包括Ha…

FastEdit ⚡:在10秒内编辑大型语言模型

概述&#xff1a; 这个仓库旨在通过一个单一的命令&#xff0c;有效地将新鲜且定制化的知识注入到大型语言模型中&#xff0c;以辅助开发人员的工作。 支持的模型&#xff1a;○ GPT-J (6B)○ LLaMA (7B/13B)○ BLOOM (7.1B)○ Falcon (7B)○ Baichuan (7B/13B)○ InternLM (7…

Java语法和C#语法有哪些异同?

Java和C#是两种流行的面向对象编程语言&#xff0c;它们有许多相似之处&#xff0c;因为它们都受到C和面向对象编程的影响。但它们也有一些语法上的异同&#xff0c;让我们来看看它们的一些主要异同点&#xff1a; 相同点&#xff1a; 1、面向对象编程&#xff1a;Java和C#都…

stable diffusion windows本地搭建的坑

刚刚2小时前&#xff0c;我搭好了&#xff0c;欣喜若狂&#xff0c;开放端口&#xff0c;同事也尝试了。我的配置 16G内存&#xff0c;AMD卡&#xff0c;有gpu但是没有用。这里不说具体步骤&#xff0c;只说坑点。 首先就是安装gfpgan、clip、openclip问题&#xff0c;我参考…

MySQL的MVCC是否解决幻读

MySQL的MVCC是否解决幻读 MySQL事务隔离级别 ✓ 读未提交&#xff08;Read Uncommitted&#xff09;&#xff1a;最低的隔离级别&#xff0c;会读取到其他事务还未提交的内容&#xff0c;存在脏读。 ✓ 读已提交&#xff08;Read Committed&#xff09;&#xff1a;读取到的内容…

Linux/ubuntu 如何使用 SCP 和 SFTP 安全传输文件

本文章向大家介绍Linux如何使用 SCP 和 SFTP 安全传输文件&#xff0c;主要内容包括使用 SCP 复制文件、使用 SFTP 复制文件、总结、基本概念、基础应用、原理机制和需要注意的事项等&#xff0c;并结合实例形式分析了其使用技巧&#xff0c;希望通过本文能帮助到大家理解应用这…

ChatGPT在音乐创作和生成中的应用如何?

ChatGPT在音乐创作和生成领域的应用非常有趣且多样化。虽然ChatGPT是一种自然语言处理模型&#xff0c;它并不是专门为音乐生成设计的&#xff0c;但它具有创造性和想象力&#xff0c;可以在一定程度上用于音乐创作。在音乐生成领域&#xff0c;有许多方法和技术可以将自然语言…

Kind | Kubernetes in Docker 把k8s装进docker!

有点像杰克船长的黑珍珠 目录 零、说明 一、安装 安装 Docker 安装 kubectl 安装 kind 二、创建/切换/删除集群 创建 切换 删除 将镜像加载到 kind 群集中 零、说明 官网&#xff1a;kind Kind&#xff1a; Kubernetes in Docker 的简称。kind 是一个使用 Docker 容…

用C语言写单片机驱动步进电机正反转角度程序

下面是一个简单的例子实现步进电机的正反转角度控制&#xff1a; c #include <reg51.h> #define MOTOR_PORT P1 // 步进电机的控制端口 // 定义正转和反转的步进电机序列 unsigned char forward_seq[4] {0x01, 0x02, 0x04, 0x08}; unsigned char backward_seq[4] …

CentOS5678 repo源 地址 阿里云开源镜像站

CentOS5678 repo 地址 阿里云开源镜像站 https://mirrors.aliyun.com/repo/ CentOS-5.repo https://mirrors.aliyun.com/repo/Centos-5.repo [base] nameCentOS-$releasever - Base - mirrors.aliyun.com failovermethodpriority baseurlhttp://mirrors.aliyun.com/centos/$r…

数据仓库建设-数仓分层

数据仓库能够帮助企业做出更好的决策&#xff0c;提高业务效率和效益&#xff1b;在数据仓库建设时&#xff0c;绕不开的话题就是数仓分层。 一、数据分层的好处 1. 降低数据开发成本 通用的业务逻辑加工好&#xff0c;后续的开发任务可以基于模型快速使用&#xff0c;数据需…

数据库管理-第九十三期 19c OCM之路-第四堂(01)(20230719)

第九十三期 19c OCM之路-第四堂&#xff08;01&#xff09;&#xff08;20230719&#xff09; 距离上一期19c OCM之路已经过去了整整8天了&#xff0c;这中间发生的事情详见第九十二期。本期来到第四堂Performance management性能管理&#xff0c;但是一开始需要把上一堂的一些…