首页 > 其他分享 >【LeetCode最详尽解答】15-三数之和 3sum

【LeetCode最详尽解答】15-三数之和 3sum

时间:2024-06-16 11:30:48浏览次数:17  
标签:15 nums 3sum 三数 复杂度 数组 排序 我们 指针

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家!

链接:

直觉

示例:

输入: 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]

注意输出的顺序和三元组的顺序无关。

首先,我们应该记住,解决方案集不得包含重复的三元组。考虑这个示例 [-3, 3, 4, -3, 1, 2],我们需要找到 _+_+_ = 0。如果我们先看索引 0,那么它将填充 -3(索引[0]) + 1 + 2 = 0。但是,当我们到达索引 3 时,它仍然具有相同的组合,即 -3(索引[3]) + 1 + 2 = 0。这就是重复的。因此,我们可以首先对数组进行排序来处理它。在这种情况下,它将排序为 [-3, -3, 1, 2, 3, 4],当我们遇到第二个 -3 时,我们可以跳过它。

对于 _+_+_ = 0,当我们选择第一个元素时,我们需要在剩余排序数组中找到两个元素,它们的和等于负的第一个元素值。然后它转换为一个两数之和的问题,类似于问题 167-两数之和 II-输入数组已排序,即在排序数组中找到两个数的和。在此示例中,排序后的数组将变为 [-4, -1, -1, 0, 1, 2],我们应该遍历整个数组,找到 -4 + [-1, -1, 0, 1, 2] = 0,然后 -1 + [-1, 0, 1, 2] = 0,然后跳过第二个 -1,然后 0 + [1, 2] = 0,等等。

当我们遍历整个数组时,我们还应该添加一些基本情况。如果 nums[i] > 0,那么我们中断,因为数组是递增顺序的。如果 nums[i] == nums[i-1],我们应该继续循环,因为如果我们不进行此操作,答案将重复。考虑 [-1, -1, 0, 1, 2]。对于第一个 -1,它将有 [-1, -1, 2][-1, 0, 1]。对于第二个 -1,它也将有 [-1, 0, 1],这会重复答案。因为第一个 -1 的剩余数组包含了第二个 -1 的剩余数组。

然后我们可以处理这个问题。让两个指针指向剩余数组的开始和结束位置:左指针为 i + 1,右指针为数组的末尾位置。如果这三个值小于 0,那么将 l 向右移动。如果这三个值大于 0,那么将 r 向左移动。否则,我们可以将这三个值追加到结果中。之后,我们应该增加左指针并减少右指针,因为数组不仅包含一个解决方案。然而,为了避免重复的解决方案,我们还需要做一个额外的步骤。考虑 -1[0, 0, 0, 1, 1]。如果 left+1,我们移动到第二个 0 和第一个 1。那么,因为第二个 0 与第一个 0 是相同的值,我们不能将其视为额外的解决方案。我们应该继续将左指针向右移动且不超过右指针。最后,左指针将位于第一个 1,与右指针在同一位置,它将不会进入 while l < r 循环,结果不会追加它。

方法

  1. 对数组进行排序。
  2. 遍历排序后的数组,对于每个索引,将剩余元素转换为两数之和问题。
  3. 通过在处理两数之和问题时检查 nums[l] == nums[l-1],以及在选择基值时检查 nums[i] == nums[i-1] 来避免重复的解决方案。
  4. 最后,返回结果。

复杂度

  • 时间复杂度:
    O ( n 2 ) O(n^2) O(n2)
    • 对数组进行排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn),并且在循环中使用双指针方法需要 O ( n 2 ) O(n^2) O(n2),

复杂度

  • 时间复杂度:
    O ( n 2 ) O(n^2) O(n2)

    • 对数组进行排序需要 O ( n log ⁡ n ) O(n \log n) O(nlogn),并且在循环中使用双指针方法需要 O ( n 2 ) O(n^2) O(n2),因此总体时间复杂度为 O ( n 2 ) O(n^2) O(n2)。
  • 空间复杂度:
    O ( n ) O(n) O(n)

    • 如果不考虑用于存储输出的空间,空间复杂度为 O ( 1 ) O(1) O(1)。排序是就地完成的,只使用常量量的额外空间。

代码

class Solution(object):
    def threeSum(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        nums.sort()
        result = []
        for i in range(len(nums)):
            if nums[i] > 0:
                break
            if i > 0 and nums[i] == nums[i-1]:
                continue
            l = i+1
            r = len(nums) - 1
            while l < r:
                if nums[i] + nums[l] + nums[r] < 0:
                    l+=1
                elif nums[i] + nums[l] + nums[r] > 0:
                    r-=1
                else:
                    result.append([nums[i], nums[l], nums[r]])
                    l+=1
                    r-=1
                    while nums[l] == nums[l-1] and l < r:
                        l+=1
        return result

标签:15,nums,3sum,三数,复杂度,数组,排序,我们,指针
From: https://blog.csdn.net/weixin_53765658/article/details/139716200

相关文章

  • 西门子学习笔记15 - 位逻辑操作的学习
    1、点动操作(按下按钮就启动松开就停止)2、自锁电路(可以自己保持的状态除非常闭停止按下)3、取反操作(顾名思义就是反过来1就变成0,0就变成1)4、置为复位(置位之后如果不复位的话就会一直为1)5、区域置位和复位(从起始的位开始的5个位被全部置为1或者全部复位为0)6、单个条件的......
  • 第八天 第四章 字符串 part02 151.翻转字符串里的单词 卡码网:55.右旋转字符串
    151.翻转字符串里的单词方法很巧妙,进行了两次反转。其中细节太多了。1.如何处理首个单词前面的空格,以及后面单词之间的空格处理(最重要的部分)。2.单词反转时的下标。classSolution{public:voidreverse(string&s,intleft,intright){......
  • 24-06-15
    final、finally、finalize的区别?final:用于声明属性,方法或类,分别表示属性不可变,方法不可覆盖,其修饰的类不可继承finally:异常处理语句的一部分,表示总是执行finalize:Object类的一个方法,在垃圾回收器执行时会调用被回收对象的此方法可以覆盖此方法提供垃圾收集时其他资源......
  • 5月15日
    上午做了python实验和工程数学实验【实验编号】【实验专责】刘立嘉;【实验目的】使学生熟悉Python环境的安装与配置,熟悉Python解释器的使用。使学生掌握Python控制语句、函数结构等的基本语法知识和使用。使学生掌握Python的基本数据类型、列表、元组、字典和集......
  • WebGoC题解(4) 115.第5题 同心圆(比赛模拟题)
    题目描述学校准备在颁奖会把这次比赛的前10名的成绩用崭新的形状表示出来,这个艰巨的任务交给了小C。为了和以往不同,小C决定用每个学生的成绩作为半径画同心圆来表示。这个创新的举动需要你使用GoC编程,在一个黑色实心圆背景下,用10个红色圆表示成绩。具体形状参见输入输出样例......
  • 15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符
    15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符串,连接字符串文章目录15-字符串处理的常用函数——查找字符串,求字符串长度,分割字符串,查找指定字符,比较字符串,连接字符串1.`strstr`1.1示例代码2.`strlen`2.1示例代码3.`strtok`......
  • 【2024.06.15】35mm定焦构图练习
    图源都为午饭饭,可以在B站搜索到,侵删50期日光充足、裙、小清新、城镇、伞......
  • 2024-06-15:用go语言,Alice 和 Bob 在一个环形草地上玩一个回合制游戏。 草地上分布着一
    2024-06-15:用go语言,Alice和Bob在一个环形草地上玩一个回合制游戏。草地上分布着一些鲜花,其中Alice到Bob之间顺时针方向有x朵鲜花,逆时针方向有y朵鲜花。游戏规则如下:1.游戏从Alice开始。2.每个回合中,当前玩家必须选择顺时针或逆时针,并在所选方向上摘取一朵鲜花。......
  • 6.15 七桥问题,欧拉回路
    欧拉回路就是,用一条线,走过所有的路,而且不重复,这种问题使用了并查集并查集分为两个部分:查找:1.初始化,将每个节点都初始化成一颗树find():根据给的边,找到他们的根节点,并更新union():把根节点不一样的连成一颗树,实现几棵树变成一棵树并查集的作用:在于判断所有的节点是不是属于同一个......
  • Studying-代码随想录训练营day9| 151.反转字符串里的单词、卡码网:55.右旋转字符串、28
    第九天,......