zoukankan      html  css  js  c++  java
  • Leetcode_15【三数之和】

    文章目录:

    • 题目
    • 脚本一及注释
    • 脚本一逻辑
    • 脚本二及注释
    • 脚本二逻辑

    题目:

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    注意:答案中不可以包含重复的三元组。

    例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

    满足要求的三元组集合为:
    [
    [-1, 0, 1],
    [-1, -1, 2]
    ]


    脚本一及注释:【用时:超时,暴力破解】

    class Solution:
        def threeSum(self, nums: List[int]) -> List[List[int]]:
            n1 = 1                                #定义一个数值为1的变量,用于不断对列表切片
            nums.sort()                             #由于列表中元素不能重复
            list1 = []                              #定义一个存储结果的空列表
            for i in nums:                            #遍历列表中的元素
                nums2 = nums[n1:]                       #对列表进行切片
                while nums2:                          #遍历切片的元素
                    j = nums2.pop(0)                     #弹出切片列表中的第一个元素
                    if -(i+j) in nums2:                   #对切片列表中剩余列表元素进行遍历
                        if [i,j,-(i+j)] not in list1:           #选择总和为0的元素,并且此元素不在存放结果的列表中
                            list1.append([i,j,-(i+j)])           #若符合,则增加元素
                n1 += 1                             #n1自增
            return(list1)                            #遍历完成后,返回结果
    class Solution:
        def threeSum(self, nums: List[int]) -> List[List[int]]:
            n1 = 1
            nums.sort()
            list1 = []
            for i in nums:
                nums2 = nums[n1:]
                while nums2:
                    j = nums2.pop(0)
                    if -(i+j) in nums2:
                        if [i,j,-(i+j)] not in list1:
                            list1.append([i,j,-(i+j)])
                n1 += 1
            return(list1)
    未添加注释脚本

    脚本一逻辑:

    • 遍历所有的不重复三元组合,并将和为0的三元元素添加到新列表中
    • 这种是暴力破解的方法,结果是可行的,但再leetcode中却超时了

    脚本二及注释:

    class Solution:
        def threeSum(self, nums: List[int]) -> List[List[int]]:
            nums.sort()
            res, k = [], 0
            for k in range(len(nums) - 2):
                if nums[k] > 0: break # 1. because of j > i > k.
                if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.
                i, j = k + 1, len(nums) - 1
                while i < j: # 3. double pointer
                    s = nums[k] + nums[i] + nums[j]
                    if s < 0:
                        i += 1
                        while i < j and nums[i] == nums[i - 1]: i += 1
                    elif s > 0:
                        j -= 1
                        while i < j and nums[j] == nums[j + 1]: j -= 1
                    else:
                        res.append([nums[k], nums[i], nums[j]])
                        i += 1
                        j -= 1
                        while i < j and nums[i] == nums[i - 1]: i += 1
                        while i < j and nums[j] == nums[j + 1]: j -= 1
            return res
    class Solution:
        def threeSum(self, nums: List[int]) -> List[List[int]]:
            nums.sort()
            res, k = [], 0
            for k in range(len(nums) - 2):
                if nums[k] > 0: break # 1. because of j > i > k.
                if k > 0 and nums[k] == nums[k - 1]: continue # 2. skip the same `nums[k]`.
                i, j = k + 1, len(nums) - 1
                while i < j: # 3. double pointer
                    s = nums[k] + nums[i] + nums[j]
                    if s < 0:
                        i += 1
                        while i < j and nums[i] == nums[i - 1]: i += 1
                    elif s > 0:
                        j -= 1
                        while i < j and nums[j] == nums[j + 1]: j -= 1
                    else:
                        res.append([nums[k], nums[i], nums[j]])
                        i += 1
                        j -= 1
                        while i < j and nums[i] == nums[i - 1]: i += 1
                        while i < j and nums[j] == nums[j + 1]: j -= 1
            return res
    借鉴leetcode大神的脚本

    脚本二及逻辑:

    • 此题的解答必定需要遍历所有的元素,此脚本是更细致地处理列表中地值,将那些不需要地元素剔除掉,减少遍历的次数
  • 相关阅读:
    hdu 4651 Partition (利用五边形定理求解切割数)
    单点登录SSO的实现原理
    高速排序算法
    2014 百度之星第三题
    TR069协议向导——一个帮助你了解TR069协议的简明教程(一)
    教你用笔记本破解无线路由器password
    人脸识别算法初次了解
    JSP验证码
    GROUP BY,WHERE,HAVING之间的差别和使用方法
    typedef函数指针使用方法
  • 原文地址:https://www.cnblogs.com/mailong/p/12013909.html
Copyright © 2011-2022 走看看