首页 > 其他分享 >15. 三数之和(中)

15. 三数之和(中)

时间:2024-01-25 16:58:12浏览次数:25  
标签:15 nums 重复 三数 三元组 res 指针

目录

题目

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

题解:排序+双指针

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n = len(nums)
        res = []
        if not nums or n < 3:  # 如果列表为空或者长度小于3,直接返回空列表
            return []
        nums.sort()  # 对列表进行排序,方便后续使用双指针法
        res = []
        for i in range(n):
            if nums[i] > 0:  # i对应的数在排序后是最小的,如果当前数大于0,则无法凑成和为0的三元组,直接返回结果
                return res
            if i > 0 and nums[i] == nums[i - 1]:  # 跳过重复的数字,避免重复计算
                continue
            L = i + 1  # 左指针初始位置
            R = n - 1  # 右指针初始位置
            while L < R:
                if nums[i] + nums[L] + nums[R] == 0:  # 找到和为0的三元组
                    res.append([nums[i], nums[L], nums[R]])
                    while L < R and nums[L] == nums[L + 1]:  # 跳过左指针重复的数字
                        L = L + 1
                    while L < R and nums[R] == nums[R - 1]:  # 跳过右指针重复的数字
                        R = R - 1
                    L = L + 1  # 在已经找到和为0的情况下,左右指针进行更新
                    R = R - 1  
                elif nums[i] + nums[L] + nums[R] > 0:  # 三数之和大于0,说明右指针的数太大,需要左移右指针
                    R = R - 1
                else:  # 三数之和小于0,说明左指针的数太小,需要右移左指针
                    L = L + 1
        return res

标签:15,nums,重复,三数,三元组,res,指针
From: https://www.cnblogs.com/lushuang55/p/17987502

相关文章

  • P1597 语句解析
    1.题目介绍语句解析题目背景木有背景……题目描述一串长度不超过\(255\)的PASCAL语言代码,只有\(a,b,c\)三个变量,而且只有赋值语句,赋值只能是一个一位的数字或一个变量,每条赋值语句的格式是[变量]:=[变量或一位整数];。未赋值的变量值为\(0\)输出\(a,b,c\)的值。......
  • 大三寒假学习进度笔记15
    今日整理了一下本次项目中使用到的技术 首先数字人方面主要使用到的是辅助神经场(nerf)算法,有关此算法的具体讲解辐射神经场算法——NeRF算法详解-CSDN博客之后是NLP,NLP的全称是NatuarlLanguageProcessing,中文意思是自然语言处理,是人工智能领域的一个重要方向自然语言处理(NL......
  • hey_left 15 Codeforces Round 835 (Div. 4)
    题目链接A.总和-最小值-最大值即为中间数#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){inta,b,c;cin>>a>>b>>c;cout<<a+b+c-min({a,b,c})-max({a,b,c})<<'\n';}signedmain(){io......
  • P1536 村村通(并查集)
    村村通题目描述某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府"村村通工程"的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?输入格式输入包含若干......
  • 洛谷题单指南-模拟和高精度-P1591 阶乘数码
    原题链接:https://www.luogu.com.cn/problem/P1591题意解读:此题核心就是通过高精度*低精度计算阶乘,然后统计数码个数即可,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;vector<int>mul(vector<int>&a,intb){vector<int>result;intt......
  • Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
    概述在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__(),然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是......
  • 「杂题乱刷」P1558
    好久没写cnblog了,来写一下。做一下恢复训练。P1558(色板游戏)数据结构板子题?反正我一开始是不知道怎么去维护的。反正我代码分块写的跟线段树一样思路大致是把图的颜色化成二进制,然后就很好做了,注意更新时记得顺便维护答案。给大家几个样例来调代码:hack1in:100302C1......
  • 寒假生活指导15
    #相关模块导入fromseleniumimportwebdriver#selenium4版本必须要设置浏览器选项,否则会闪退option=webdriver.EdgeOptions()option.add_experimental_option("detach",True)#实例化浏览器驱动对象,并将配置浏览器选项driver=webdriver.Edge(options=option)#......
  • [转帖]ORA-01450 maximum key length (3215) exceeded
    一、问题背景给一个业务表online建索引时遇到了ORA-01450maximumkeylength(3215)exceeded报错,看字面意思是字段太长了,检查表字段类型发现基本都是nvarchar2(2000),有些字段(例如unit)明显是不需要这么长的,表的设计有问题,联系开发按实际需求改短后能正常创建。奇怪的是表的......
  • P5015 [NOIP2018 普及组] 标题统计
    1.题目介绍[NOIP2018普及组]标题统计题目背景NOIP2018普及组T1题目描述凯凯刚写了一篇美妙的作文,请问这篇作文的标题中有多少个字符?注意:标题中可能包含大、小写英文字母、数字字符、空格和换行符。统计标题字符数时,空格和换行符不计算在内。输入格式输入文件只有一行,......