首页 > 其他分享 >三数之和---双指针

三数之和---双指针

时间:2023-02-28 16:03:50浏览次数:37  
标签:nums -- 三数 示例 三元组 --- ++ 指针

三数之和

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路

类似两数之和,两数之和是排序之后进行二分查找。三数之和是通过排序之后确定一个值之后使用双指针进行查找。先对数组进行排序,在从后往前遍历,也就是确定一个数i之后使用双指针查找另外两个数:

  1. l = 0,r = i-1
  2. nums[l] + nums[r] + nums[i] == 0,l++,r--
  3. nums[l] + nums[r] + nums[i] > 0, 大了,r--
  4. nums[l] + nums[r] + nums[i] < 0,小了,l++
  5. 要解决一下重复的问题即可

code

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {

        vector<vector<int>> ans;
        sort(nums.begin(),nums.end());
        
        for(auto item : nums) cout<<item<<" ";


        for(int i = nums.size() -1;i >= 0;i --)
        {
            if(nums[i] < 0) break;
            if(i != nums.size() - 1 && nums[i] == nums[i+1]) continue;
            
            int l = 0,r = i -1;
            while(l < r)
            {
                if(nums[l] + nums[r] + nums[i] == 0)
                {
                    ans.push_back({nums[l],nums[r],nums[i]});
                    while(l < r && nums[l] == nums[l+1]) l++;
                    while(l < r && nums[r] == nums[r-1]) r--;
                    l ++;
                    r --;
                }
                else if(nums[l] + nums[r] + nums[i] > 0)
                {
                    r--;
                }
                else
                {
                    l++;
                }
            }
        }

        return ans;

        
    }
};

标签:nums,--,三数,示例,三元组,---,++,指针
From: https://www.cnblogs.com/huangxk23/p/17164596.html

相关文章

  • MogDB 学习笔记之 --exchange partition
    #概念描述MogDB提供了从分区交换的功能,如单表转化到一个分区中基本语法:ALTERTABLE...EXCHANGEPARTITION数据库版本#测试验证##1、环境准备```miao=>selectversio......
  • H7-TOOL发布V2.20带来原创RTOS Trace,截图,Scope功能,脱机烧录增加PSoC6, 中颖, 笙泉,
    新功能视频介绍:https://www.bilibili.com/video/BV1ss4y1f7MVH7-TOOL所有资源汇总(含操作手册):http://www.armbbs.cn/forum.php?mod=viewthread&tid=89934PC机软件:升级......
  • ciser-0.1发布页
    ciser-0.1发布页作者在肝了不知道多长时间之后,总算完成了基本的工作。这个是JZX102624的重置版,原版请去找Keatsli。由于原作者写的bug过多,并且实现的功能过少,所以我重置......
  • 单个表空间文件个数达到上限 ORA-01686
    #问题概述因在oracle数据库表空间管理中的时候报ORA-01686:max#files(1023)reachedforthetablespaceGPRSSQL>altertablespaceGPRSadddatafile'+DATADG'......
  • 【django-vue】前端取消默认样式 main.js配置 后端主页模块接口 跨域问题详解 项目自
    目录回顾上节课回顾今日内容1前端全局样式和js配置1.1global.css1.2settings.js1.3main.js2后端主页模块接口三种开发模式模型父类BaseModel轮播图模型类代码轮播图接......
  • L1-011 A-B【团体程序设计天梯赛-练习集】
    L1-011A-B题要求你计算A−B。不过麻烦的是,A和B都是字符串——即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。输入格式:输入在2行中先后......
  • 19-命令模式
    19-命令模式概念命令模式(Command),将一个请求封装成一个对象,从而是你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作命令模式作用第一:能......
  • 温习日志-21
    温习日志——2023年2月28日下午学习内容ABriefIntroductiontotheCommandLine通过在终端,输入cd相对路径实现更改路径在终端输入ls会列出当前所在文件夹的所有......
  • 金蝶VB插件--单据保存前检查
    金蝶VB插件--单据保存前检查--转自https://bbs.csdn.net/topics/360161119?list=lzvb代码引用k3classEvents'-----以下是代码'实现一个很简单的功能'--单据体分录[F......
  • Continuous improvement of self-driving cars using dynamic confidence-aware reinf
    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布!NatureMachineIntelligence,2023,5(2):145-158 Abstract今天的自动驾驶汽车已经取得了令人印象深刻的......