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

三数之和(双指针)

时间:2024-12-05 20:33:12浏览次数:9  
标签:nums int 三数 示例 三元组 vector ans 指针

题目来源:5. 三数之和

给你一个整数数组 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
  • -105 <= nums[i] <= 105
  • class Solution {
    public:
        vector<vector<int>> threeSum(vector<int>& nums) {
            sort(nums.begin(),nums.end());
            vector<vector<int>> ans;
            for(int i=0;i<nums.size();i++)
            {
                if(nums[i]>0) return ans;
                if(i>0&&nums[i]==nums[i-1]) continue;
                int l=i+1;
                int r=nums.size()-1;
                while(l<r)
                {
                    if(nums[l]+nums[r]+nums[i]==0)
                    {
                        ans.push_back(vector<int>{nums[i], nums[l], nums[r]});
                        //去重
                        while(l<r&&nums[l]==nums[l+1]) l++;
                        while(l<r&&nums[r]==nums[r-1]) r--;
                        l++,r--;
                    }
                   else if (nums[i] + nums[l] + nums[r] > 0) r--;
                   else l++;
                }
            }
            return ans;
        }
    };

标签:nums,int,三数,示例,三元组,vector,ans,指针
From: https://blog.csdn.net/m0_74014534/article/details/144275235

相关文章

  • 华为编程-有效的括号(指针vs栈)
    有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。解题一(指针思想):不难发现有效的括号一个规律,当出现左半括......
  • 关于指针变量作函数参数的补充
     三个数从大到小输出#include<stdio.h>voidexchange(int*q1,int*q2,int*q3);voidswap(int*pt1,int*pt2);inta,b,c;int*p1,*p2,*p3;intmain(){ scanf("%d,%d,%d",&a,&b,&c); p1=&a; p2=&b; p3=&c; exchange(p1,p2,p3);......
  • 指针变量作为函数参数
    函数参数不仅可以是整型,浮点型,字符型等数据,还可以为指针变量,但**指针变量和整型等数据在函数调用时仍采取的是“值传递”方式,它们都遵循“单向传输”原则--即不能由形参传输至实参。(函数的声明和定义里参数一般为形参,而作为调用函数里的参数为实参)。比如下面按从大到小输出2个数......
  • 实验5 c语言指针应用编程
    1#include<stdio.h>2#defineN534voidinput(intx[],intn);5voidoutput(intx[],intn);6voidfind_min_max(intx[],intn,int*pmin,int*pmax);78intmain(){9inta[N];10intmin,max;1112printf("录入%d......
  • C语言之做一个可供调用的函数指针表
    C语言之做一个可供调用的函数指针表这篇C语言之为表达式计算器实现函数调用功能中,函数表方法是按参数多少来定义函数指针,这次再研究一下函数指针,做一个更好用的函数指针表!!!有参数的函数指针定义函数hello,无返回值,一个参数定义函数指针fp,无返回值,一个参数:void(fp)(char......
  • 3-2 C指针与动态内存
    前言:基于本人回顾与思考撰写,仅供学习参考......1.0为什么使用动态内存typedefstruct{uint8_tparamType;uint8_tvalue[100];uint32_tsize;}CfgParam;staticCfgParamg_cfgParam;g_cfgParam.paramType=1;g_cfgParam.value[0]=0x9A;g_cfg......
  • 获取到的值不为空,存入对象属性时,报空指针错误
    publicTenantAccessTokentenantAccessToken;/***获取token*@return*/@OverridepublicTenantAccessTokengetTenantAccessToken(){if(tenantAccessToken==null||tenantAccessToken.getTenantAccessTok......
  • 【双指针进阶】深入理解双指针作用——滑动窗口题型带你一网打尽!
    文章目录长度最小的子数组无重复字符的最长子串最大连续1的个数|||将X减到0的最小操作数水果成篮找到字符串中所有字母的异位词串联所有单词的子串最小覆盖子串长度最小的子数组解题思路:使用两个指针begin和end构建滑动窗口,begin表示窗口的左边界,end表示右边界。......
  • C语言基础知识:指针(4)
        本期内容,将继续介绍C语言中的指针,带大家理解一些指针变量的特点,以及二位数组传参的本质和转移表的相关知识。    一.字符指针变量      之前我们介绍过一种指针类型为字符指针:char*。它可以存放字符的地址,解引用字符指针就能得到这个字符: ......
  • 不要用指针指向局部变量
    #include<stdio.h>intmain(){int*p=NULL;inti=1;switch(1){case1:{p=&i;printf("Insideswitch-Addressofi:%p,Valueofp:%p\n",(void*)&i,(void*)p);......