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

15. 三数之和

时间:2023-07-25 18:23:13浏览次数:37  
标签:15 nums vi res 三元组 zero len 三数

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

 

题解1:

时间 5804ms 击败 7.56%使用 Python3 的用户 内存 19.36mb 击败 7.31%使用 Python3 的用户
class Solution:
    # 二分查找
    def find(self, num: int, nums: list[int]) -> int:
        start = 0
        end = len(nums) - 1
        while start <= end:
            mid = (end + start) // 2
            item = nums[mid]
            if num == item:
                return mid
            elif num < item:
                end = mid - 1
            else:
                start = mid + 1

        return -1

    def threeSumSub(self, nums: list[int], arr: list[int], has_zero: bool) -> list[[int]]:
        res = []
        nums_len = len(nums)
        tempi = None
        for i in range(0, nums_len):
            vi = nums[i]
            if vi == tempi:
                continue
            tempi = vi
            if has_zero and vi < 0:
                index = self.find(-vi, arr)
                if index > -1:
                    res.append([vi, 0, -vi])

            tempj = None
            if i + 1 == nums_len:
                break
            for j in range(i + 1, nums_len):
                vj = nums[j]
                if vj == tempj:
                    continue
                tempj = vj

                vs = -(vi + vj)
                index = self.find(vs, arr)
                if index > -1:
                    res.append([vi, vj, vs])

        return res

    # 15. 三数之和
    def threeSum(self, nums: list[int]) -> list[list[int]]:
        res = []
        small = []
        zero = []
        big = []
        nums.sort()
        for item in nums:
            if item < 0:
                small.append(item)
            elif item == 0:
                zero.append(item)
            else:
                big.append(item)

        has_zero = len(zero) > 0
        res_small = self.threeSumSub(small, big, has_zero)
        res_big = self.threeSumSub(big, small, has_zero)
        res = res_small + res_big
        if len(zero) > 2:
            res.append([0, 0, 0])

        return res

 

标签:15,nums,vi,res,三元组,zero,len,三数
From: https://www.cnblogs.com/tros/p/17580530.html

相关文章

  • 题解 P1150 【Peter的烟】
    postedon2020-11-1410:00:20|under题解|source2023编者注:本篇题解的方法过于暴力,但是尊重历史。请不要太在意。—-教你们用栈做这道题原题传送门看到这题,第一反应是用stack做。我们可以把Peter手上的烟看作一个栈,一根烟就是一个元素,抽了\(n\)支烟就从栈里pop几个,......
  • 题解 CF1501A 【Alexey and Train】
    postedon2021-03-1321:57:02|under题解|source简单模拟题,考验选手的读题能力和使用谷歌翻译的能力。先定义一个\(now=0\),我们最后算出来的结果为\(now\)。对于每个站(不包括第\(n\)站),我们需要加上\(3\)个部分:额外时间,now+=ex[i];第\(i-1\)站到第\(i\)站的时......
  • 题解 CF1501B 【Napoleon Cake】
    postedon2021-03-1617:42:06|under题解|source题目可以转化一下:给一个长为\(n\)的数组\(a\),请求出一个长为\(n\)的数组\(b\)。要求若\(a_i\)不为\(0\),则\([b_{i-a_i+1},b_i]\)这个区间要为\(1\)。知道这个题目意思就好办了。题目说\(n\leq2\times10^5\),......
  • 题解 P1538 【迎春舞会之数字舞蹈】
    postedon2021-06-0113:24:05|under题解|source给\(0\cdots9\)每个数字打表,打它在相应的位置有没有一划。然后把每个数字分成\(5\)部分,暴力输出即可。#include<cstdio>#include<cstring>usingnamespacestd;constchar*db[]={"-||||-","||"......
  • 【集成学习(下)】Task15 集成学习-案例 蒸汽量预测
    文章目录集成学习案例二(蒸汽量预测)背景介绍数据信息评价指标导入package加载数据探索数据分布小小个人总结特征工程模型构建以及集成学习进行模型的预测以及结果的保存参考集成学习案例二(蒸汽量预测)背景介绍火力发电的基本原理是:燃料在燃烧时加热水生成蒸汽,蒸汽压力推动汽轮机旋......
  • 15个实用的Linux find命令示例
    译文出处:oschina-青崖白鹿。欢迎加入技术翻译小组。<!--divid="ad1"><scripttype="text/javascript">google_ad_client="ca-pub-7056282119617872";google_ad_slot="6645040531";google_ad_width=300;google_ad_height=250......
  • (数据科学学习手札153)基于martin的高性能矢量切片地图服务构建
    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes1简介大家好我是费老师,在日常研发地图类应用的场景中,为了在地图上快速加载大量的矢量要素,且方便快捷的在前端处理矢量的样式,且矢量数据可以携带对应的若干属性字段,目前主流的做法......
  • 15款提高表格操作的jQuery插件
       table表格由于它的浏览器兼容性和复杂的标签嵌套方式,可以算是添加样式最困难的对象之一了。大多数前端er都把网页中的table标签替换为div,主要就是因为div要比table更容易添加CSS样式。但是我们在日常应用中仍然要用到table表格,其中最好的例子就是对照表。今天彬Go将向大家......
  • 设计师必读的15个响应式网页设计教程
    @陈子木 响应式设计是由著名网页设计师EthanMarcotte在2010年5月提出的设计概念,随后席卷前端和设计领域,成为了如今网页设计的大趋势。正如同Ethan所说:“响应式网站设计提供了一种全新的选择,这种基于栅格布局和CSS3的流动性网页设计,可以让网页随着屏幕变化而响应。这是一种更为统......
  • AT_abc215_d 题解
    洛谷链接&Atcoder链接本篇题解为此题较简单做法及较少码量,并且码风优良,请放心阅读。题目简述给定\(N\),\(M\)及含有\(N\)个整数的序列\(A\)。求\(1\simM\)中与所有\(a_i\)均互质的整数及个数。思路首先说一下最开始的想法。直接暴力枚举\(1\simM\)的数,再分......