首页 > 其他分享 >LeetCode 热题 100 之 15. 三数之和

LeetCode 热题 100 之 15. 三数之和

时间:2023-07-17 10:57:09浏览次数:27  
标签:15 nums 三数 示例 List 三元组 res 100 指针

题目描述

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

思路

排序 + 双指针
由于输入的顺序与三元组的顺序无关,因此改变数在数组中的位置并无关紧要。对数组先排序再处理极大方便了解题。
需要注意的是,题目不允许出现重复解。因此在每一层枚举时要注意去除重复元素
代码由外循环和两个指针组成,对应的数分别为nums[i],nums[j],nums[k],

  • 外层循环,若nums[i]>0,则必定不可能有nums[i]+nums[j]+nums[k]=0,直接结束循环。
  • 两个指针j,k从i+1,len(nums)-1开始变化。当 j<k 时,执行循环:
    case1: 当nums[i]+nums[j]+nums[k]=0时则加入列表中,指针移动,直到元素改变后结束移动指针,再寻找新的解。
    case2: 若和大于0,则说明当前nums[k] 太大, k左移
    case3: 若和小于0,则说明当前nums[j] 太小,j右移

代码

class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        n=len(nums)
        # 排序
        nums.sort()
        # 记录结果
        res=[]
        for i in range(n):
            # 当三个数中最小的数都大于0了,往后肯定找不到符合答案的值了
            if(nums[i]>0):
                return res
            # 排除重复的元素
            if(i>0 and nums[i]==nums[i-1]):
                continue
            j=i+1
            k=n-1
            while(j<k):
                if(nums[i]+nums[j]+nums[k]==0):
                    # 满足条件,加入答案列表
                    res.append([nums[i],nums[j],nums[k]])
                    # 排除重复的元素(找到第一个比nums[j]大的数)
                    while(j<k and nums[j]==nums[j+1]):
                        j=j+1
                    # 排除重复的元素(找到第一个比nums[k]小的数)
                    while(j<k and nums[k]==nums[k-1]):
                        k=k-1
                    j=j+1
                    k=k-1
                # 和大于0,nums[k]太大了
                elif(nums[i]+nums[j]+nums[k]>0):
                    k=k-1
                # 和小于0,nums[j]太大了
                else:
                    j=j+1
        return res

标签:15,nums,三数,示例,List,三元组,res,100,指针
From: https://www.cnblogs.com/anamzingclown/p/17559399.html

相关文章

  • LeetCode 热题 100 之 11. 盛最多水的容器
    题目描述给定一个长度为n的整数数组 height 。有 n 条垂线,第i条线的两个端点是 (i,0) 和 (i,height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器。示例1:输入:[1,8,6,2,5,4,8,3......
  • 7.15晚模拟赛总结
    暑假第一次模拟赛  先开T1,发现样例看不懂(后来发现是题目的样例解释写错了)自信打开T2,发现没有任何思路(赛后听mhd大佬说了人类智慧双指针,茅厕顿开!!),又跳过T3,发现坐过原题,但是只记得一点点思路了,后悔ING了十几分钟后开始打,打炸了,调了好久才过样例,结果是有致命思路错误,只有20ptsT4......
  • 第100篇,写给最爱的人,一周年快乐
    这篇没有渲染,没有图片,就是我想对你重新表白。正好这是我第100篇文章,用这种形式也算是我的一份小礼物吧。一年前,你用一句“你生日这天把我送给你应该是你最想要的礼物了吧”,“空着手”就答应了我的追求,你也说“从一个人到两个人,从卸下防备到开怀大笑”。再到这一年里发生的所有事......
  • redis-server CPU 100%
    如何实现"redis-serverCPU100%"介绍在本文中,我将指导你如何通过一系列步骤来实现"redis-serverCPU100%"。这个过程可能会导致服务器负载升高,因此请谨慎操作,并确保你在实验环境中进行。整体流程在下面的表格中,我将列出实现这个目标的步骤和对应的代码:步骤描述1......
  • HHHOJ #1247. 「NOIP 2023 模拟赛 20230715 A」1 题解--zhengjun
    法老找来的题,说是找了三道其他模拟赛的T4拼成T1~T3,另外搞了道T4。思维好题,但是放在T1有点搞心态,但是还好大样例够强,400没挂。然而T3大样例输出错了,浪费了我0.5h,差评。首先发现向左走之后向右走是一定不优的,所以最短路的情况只能先向右再向左。考虑枚举起点\(s......
  • 第15天
    一、数组复制 二、评委打分0packagecom.lianxi.www;importjava.util.Scanner;publicclass评委打分{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);int[]arr=newint[6];intcount=0;......
  • android:padding="15dp
    Android中的padding属性解析在Android开发中,我们经常会使用到布局文件来定义界面的结构和外观。其中,android:padding属性是一个非常常见的属性之一,用于设置控件的内边距。本篇文章将为大家介绍android:padding属性的使用方法以及相关知识点。1.android:padding属性的作用androi......
  • 暑期 7.15 第一周博客总结
    在这一周中我学习了SSM的基本框架,学习了springboot与mybats等的基本知识,我也学习了b站上黑马程序员最新出的javaweb的视频教程,我又深入学习了一下javascri的语法。1.我学习了浏览器弹出框的警告:window.alert("")//浏览器弹出警示框document.alert("")//写入html在浏览器展示co......
  • 7.9-7.15博客
    本周(7.9-7.15)主要返家并在家进行休息。下周准备开始学习大数据的相关知识。虽然我觉得下周的计划可能完不成,但是计划总是要有的。周日,室友陆续回家,看了一下整个学期的学习总结。写了博客。周一,在宿舍玩了一天。周二,11号准备回家。周三,报考了驾考,再不考好像没时间了。周四,进行......
  • 7.15--暑假第一周总结
      这一周下载并配置好了VMWare虚拟机,Datagrip用于连接hive数据库,下载好了FinalShell用于便利LInux虚拟机指令操作。  学习完了Linux命令,看完了黑马程序员里关于Linux小白的全部内容,学习了大数据视频内容,一共88集目前已经看到52集,学习了mapreduce,yarn以及hive数据库的部分......