双指针解决三元组问题

news2024/11/24 20:25:04

山海自有归期

风雨自有相逢


CSDN 请求进入专栏             ​​​​                     

是否进入《数据结构专栏》?

确定

目录

三数之和 

题目描述

输入输出样例

思路

代码测试

复杂度分析

 

三数之和 

题目链接:三数之和


题目描述

给你一个整数数组 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
  • -10^5 <= nums[i] <= 10^5

思路

双指针+排序

<1>从 暴力 解法开始考虑问题

首先我们从(暴力枚举)的方法开始考虑

我们直接使用三重 for 循环枚举三元组,时间复杂度为 O(N^3) 这样效率是不高的,所以我们要在暴力的基础上不断的去 优化 算法

<2>利用 排序 算法整理去重数据

我们以示例一为例:nums = [-1,0,1,2,-1,-4]

那么[[0,1,-1],[-1,0,1]],[[1,2,-1]]是属于三元组的

注意:题目明确输出的顺序和三元组的顺序并不重要

所以我们在枚举完三元组后还需进行 去重 操作,为了避免后续数据整理上的麻烦

我们可以使用 排序 算法让数组有序化,这样 相同 的三元组仅仅只有一种排列形式

[[0,1,-1],[-1,0,1]] 的去重问题就好解决了

<3>利用 双指针 优化 暴力 解法

(1) 固定一个数a

(2) 在 a 的后面区间利用 双指针 算法,快速找到 两数之和 等于 -a

nums[left]+nums[right] = -a

<4>细节问题的处理

(1)去重问题

因为我们已经排好序了,对于重复的元素我们可以直接控制下标移动

采用 set容器 去重虽然便捷,但是在面试中并不建议
利用单调性去重<1>找到一种结果之后,left right 指针要跳过重复元素
<2>当使用完一次双指针算法之后,i 也需要跳过重复元素

我们以下的代码测试采用单调性的性质去重

(2)边界问题

我们要设置数组边界,防止数组越界

(3)数据遗漏

找到一种结果之后,不要 停  ,继续缩小区间,继续寻找

(4)细节上的优化

利用三元组 nums[left]+nums[right] = -a 的性质优化代码


代码测试

class Solution 
{
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        //创建容器存储三元组
        vector<vector<int>> ret;
        //排序
        sort(nums.begin(),nums.end());
        int n = nums.size();
        for(int i = 0;i<n;)
        {
        //细节优化
            if(nums[i]>0) break;
            int left = i+1,right = n-1;
            int m = - nums[i];
            while(left<right)
            {
                int sum = nums[left]+nums[right];
                if(sum>m) right--;
                else if(sum<m) left++;
                else if(sum == m)
                {
        //找到三元组,并装进ret中
                    ret.push_back({nums[i],nums[left],nums[right]});
                    left++;
                    right--;
        //去重,双指针边界考虑
                while(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;
    }
};

复杂度分析

时间复杂度:O(N)

空间复杂度:O(log⁡N)

 

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

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

相关文章

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…

初探深度学习-手写字体识别

前言 手写数字的神经网络识别通常指的是通过训练有素的神经网络模型来识别和分类手写数字图像的任务。这种类型的任务是机器学习和计算机视觉领域的一个经典问题&#xff0c;经常作为入门级的图像识别问题来展示和测试各种机器学习算法的能力。在实际应用中&#xff0c;手写数…

比肩Gen-2,全新开源文生视频模型

著名开源平台Stability.ai在官网宣布&#xff0c;推出全新文生视频的扩散模型Stable Video Diffusion&#xff0c;已开源了该项目并公布了论文。 据悉&#xff0c;用户通过文本或图像就能生成高精准&#xff0c;14帧和25帧的短视频。目前&#xff0c;Stable Video Diffusion处…

为 OpenBMC 添加一个新的系统

1. 前言 在上一篇文章中向大家介绍了 OpenBMC 的是什么以及它的作用和应用场景&#xff0c;并且以一个自带的示例平台 romulus 展示了从下载源码包开始到启动系统并访问 Web 控制页面的整体构建流程。 通过前文已经了解到如何为已有的平台构建系统镜像&#xff0c;下面我们来…

如何使用LEAKEY轻松检测和验证目标服务泄露的敏感凭证

关于LEAKEY LEAKEY是一款功能强大的Bash脚本&#xff0c;该脚本能够检测和验证目标服务中意外泄露的敏感凭证&#xff0c;以帮助广大研究人员检测目标服务的数据安全状况。值得一提的是&#xff0c;LEAKEY支持高度自定义开发&#xff0c;能够轻松添加要检测的新服务。 LEAKEY主…

自动灭火贴有用吗?搞清楚自动灭火贴的使用范围很关键!

近年来&#xff0c;伴随着新能源车辆的自燃案例频频发生&#xff0c;许多新型自动灭火产品走红网络。灭火球、灭火宝、灭火手雷......层出不穷的新型产品褒贬各异&#xff0c;哪怕是目前占领市场份额较多的自动灭火贴也不乏有人心里嘀咕&#xff1a;自动灭火贴好用吗&#xff1…

什么是Docker容器?

Docker是一种轻量级的虚拟化技术&#xff0c;同时是一个开源的应用容器运行环境搭建平台&#xff0c;可以让开发者以便捷方式打包应用到一个可移植的容器中&#xff0c;然后安装至任何运行Linux或Windows等系统的服务器上。相较于传统虚拟机&#xff0c;Docker容器提供轻量化的…

Linux编程3.3 进程-进程的终止

1、正常终止 从main函数返回调用exit(标准C库函数)调用_exti或_Exit&#xff08;系统调用&#xff09;最后一个线程从其启动例程返回最后一个线程调用 pthread exit 2、异常终止 调用abort接受到一个信号并终止最后一个线程对取消请求做处理响应 3、进程返回 通常程序运行…

谷歌Gemini批量多线程写原创文章API软件-支持双标题违禁词过滤

谷歌Gemini批量多线程写原创文章软件介绍&#xff1a; 1、Gemini 是谷歌筹备了一年之久的GPT4真正竞品&#xff0c;也是目前谷歌能拿出手的功能最为强悍、适配最为灵活的大模型。 2、谷歌Gemini目前免费申请key&#xff0c;key没有额度限制&#xff0c;可以一直写文章。 3、谷…

Mint_21.3 drawing-area和goocanvas的FB笔记(四)

Cairo图形输出 cairo的surface可以是pixbuf, 可以是screen, 可以是png图&#xff0c;也可以是pdf文件 、svg文件、ps文件&#xff0c;定义了surface就可以用cairo_create(surface)产生cairo context, 操作cairo context就可以方便地在surface上画图&#xff0c;如果surface是p…

LeetCode-第137题-只出现一次的数||

1.题目描述 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。 2.样例描述 3.思路描述 先把数组排序&am…

戏说c第二十六篇: 测试完备性衡量(代码覆盖率)

前言 师弟&#xff1a;“师兄&#xff0c;我又被鄙视了。说我的系统太差&#xff0c;测试不过关。” 我&#xff1a;“怎么说&#xff1f;” 师弟&#xff1a;“每次发布版本给程夏&#xff0c;都被她发现一些bug&#xff0c;太丢人了。师兄&#xff0c;有什么方法来衡量测试的…

vue2源码分析-vue入口文件global-api分析

文章背景 vue项目开发过程中,首先会有一个初始化的流程,以及我们会使用到很多全局的api,如 this.$set this.$delete this.$nextTick,以及初始化方法extend,initUse, initMixin , initExtend, initAssetRegisters 等等那它们是怎么实现,让我们一起来探究下吧 源码目录 global-…

2024年展望Android原生开发的现状,2024网易Android高级面试题及答案

没有稳定的工作&#xff0c;只有稳定的能力。 又到了万物复苏的季节&#xff0c;在程序猿这个行当里&#xff0c;作为 Android 开发出生的&#xff0c;在经历了八年的脱发生涯后&#xff0c;有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起&#xff0c;在 ReactNati…

基于SpringBoot+Vue实现的人力资源管理系统

系统介绍&#xff1a; 基于SpringBootVue实现的人力资源管理系统是为了提高企业人力资源管理水平而开发的。主要目标是通过对员工及人力资源活动信息&#xff08;考勤、工资)等的编制来提高企业效率。 系统一共分为五大菜单项&#xff0c;分别是首页、薪资管理、权限管理、系统…

魔行观察-每日品牌监测-沪上阿姨-开店趋势

今日监测对象&#xff1a;沪上阿姨&#xff0c;监测时间段&#xff1a;2014年9月至2023年12月&#xff0c;发布时间&#xff1a;2024-03-05 数据获取地址&#xff1a;魔查查https://www.moxingdata.com/品牌基础信息 现有门店人均消费覆盖省份经营模式投资金额814416.531特许/…

工时管理软件:为什么企业需要工时跟踪?

工时跟踪对于企业经营来说&#xff0c;可能不是首要事项。工时跟踪有什么用&#xff1f; 管理学大师彼得德鲁克曾说过&#xff1a;If you can’t measure it, you can’t improve it&#xff08;如果无法衡量&#xff0c;就无法改进&#xff09;。企业经营也是同样道理&#x…

分布式系统中常用的缓存方案

1. 引言 随着互联网应用的发展和规模的不断扩大&#xff0c;分布式系统中的缓存成为了提升性能和扩展性的重要手段之一。本文将介绍几种在分布式系统中常用的缓存方案&#xff0c;包括分布式内存缓存、分布式键值存储、分布式对象存储和缓存网关等。 1.1 缓存在分布式系统中的…

FEP容量瓶多应用于制药光电光伏行业

常用规格&#xff1a;25ml、50ml、100ml、250mlFEP容量瓶也叫特氟龙容量瓶&#xff0c;容量瓶是为配制一定物质的量浓度的溶液用的精确定容器皿&#xff0c;常和移液管配合使用。广泛用于ICP-MS、ICP-OES等痕量分析以及同位素分析等高端实验。地质、电子化学品、半导体分析测试…

挑战杯 基于深度学习的动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…