首页 > 其他分享 >三数之和(双指针法)

三数之和(双指针法)

时间:2024-11-02 21:46:04浏览次数:3  
标签:right nums int 三数 三元组 while 指针 left

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

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        int n = nums.size();
        sort(nums.begin(), nums.end());  // 排序数组

        for (int i = 0; i < n - 2; i++) {
            if (i > 0 && nums[i] == nums[i - 1]) continue;  // 跳过重复的数

            int left = i + 1;
            int right = n - 1;
            
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                
                if (sum == 0) {
                    result.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--;
                } else if (sum < 0) {
                    left++;
                } else {
                    right--;
                }
            }
        }
        
        return result;
    }
};

 

首先对数组 nums 进行排序。排序的目的是便于使用双指针方法找到符合条件的三元组,也便于去重。

检查 nums[i] + nums[left] + nums[right] 的和。

  • 如果和等于 0,将三元组加入结果集,且移动 leftright 跳过重复的数。
  • 如果和小于 0,说明总和偏小,移动 left 指针以增加总和。
  • 如果和大于 0,说明总和偏大,移动 right 指针以减小总和。

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

    当我们找到一个满足条件的三元组 [nums[i], nums[left], nums[right]] 后,将 left 移动到下一个不同的元素上,跳过所有值与当前 nums[left] 相同的元素。
  • while (left < right && nums[right] == nums[right + 1]) right--;

    类似地,right 向左移动,跳过与当前 nums[right] 相同的元素。

标签:right,nums,int,三数,三元组,while,指针,left
From: https://blog.csdn.net/Ct314/article/details/143309037

相关文章

  • (C语言)指针(全网最详细)
    1)内存和地址内存的使用和管理1.内存划分为一个个的内存单元,每个内存单元的大小是一个字节;而每个内存单元都有自己的编号;内存单元的编号==地址==指针;一个字节相当于8个比特位(就好比一个寝室住8个人一样);在创建变量的本质就是向内存中申请空间,比如inta=10;表示向内存单元......
  • 两数之和(双指针法)
     给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1<=index1<index2<=numbers.length 。以长度为2的......
  • C++ 手撕--共享式智能指针(shared_ptr)的简单实现
    C++手撕--共享式智能指针(shared_ptr)的简单实现共享式智能指针(shared_ptr):#include<iostream>#include<mutex>usingnamespacestd;template<typenameT>classShared_ptr{private:T*ptr;int*ref_count;std::mutex*mtx;voidrelease(){......
  • java平方根计算 C语言指针变量
    1.publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);System.out.println("请输入你的数:");intnum=sc.nextInt();for(inti=1;i<=num;i++){if(i*i==num){System.out.println(i+"就是......
  • 【算法】【优选算法】双指针(上)
    目录一、双指针简介1.1对撞指针(左右指针)1.2快慢指针二、283.移动零三、1089.复写零3.1双指针解题3.2暴力解法四、202.快乐数4.1快慢指针4.2暴力解法五、11.盛最多⽔的容器5.1左右指针5.2暴力解法一、双指针简介常⻅的双指针有两种形式,⼀种是对撞指针,⼀......
  • 深入学习指针!指针史上最全解析!!(1)
    文章目录1.内存和地址1.1内存1.2究竟该如何理解编址2.指针变量和地址2.1取地址操作符(&)2.2指针变量和解引用操作符(*)2.2.1指针变量2.2.2如何拆解指针类型2.2.3解引用操作符2.3指针变量的大小3.指针变量类型的意义3.1指针的解引用3.2指针+-整数3.3void*指针4.指针运......
  • 双指针习题篇(下)
    双指针习题篇(下)文章目录双指针习题篇(下)1.有效三角形的个数题目描述:解法一:暴力枚举(超时)算法思路:代码实现:解法二:利用单调性,使用双指针算法来解决问题算法思路:算法流程:代码实现:2.和为s的两个数字题目描述:解法一:暴力枚举O(N^2^)算法思路:算法流程:代码实现:解法二......
  • 【无标题】Acwing1238_日志统计(双指针)
    原题链接 :1238.日志统计-AcWing题库https://www.acwing.com/problem/content/1240/题目要求:/***小明维护着一个程序员论坛。现在他收集了一份”点赞”日志,日志共有N行。*其中每一行的格式是:tsid表示在ts时刻编号id的帖子收到一个”赞”。*现在小明......
  • 深入理解指针(1)
    1:内存和地址1:内存我们知道计算机上面的CPU在处理数据时,需要的数据是在内存中读取的,处理后的数据也会放回内存中,那我们买电脑时,电脑内存是8GB/16GB/32GB等,那这些内存空间如何高效管理呢?其实也是内存划分为一个个的内存单元,每个内存的大小取1个字节。一个bit(比特)位可以储存一......
  • 单链表题+数组题(快慢指针和左右指针)
    @目录说明:本文章用于“单链表题+数组题”“链表”知识一、案例说明(使用快慢指针)问题1.1判断链表是否有环问题1.2:已知链表有环,请返回这个环的起点位置问题1.3:寻找无环单链表的中点,要求:如果偶数个数以左面一个节点为中点问题1.4:寻找无环单链表的中点,要求:如果偶数个数以右面一个节......