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大神的脚本

    脚本二及逻辑:

    • 此题的解答必定需要遍历所有的元素,此脚本是更细致地处理列表中地值,将那些不需要地元素剔除掉,减少遍历的次数
  • 相关阅读:
    通过ajax前端后台交互/登录页和注册页前端后台交互详解/前端后台交互基础应用/几个后台函数的基础应用/php文件函数基础应用/php字符传函数基础应用/php数组函数基础应用
    >>>---PHP中的OOP-->面对过程与面对对象基础概念与内容--(封装、继承、多态)
    基于HBuilder开发手机APP-主页/跳转页面/切换选项卡
    PHP基础学习
    JavaScript学习-js中的数组/Boolean类/字符串String类
    关于gulp中顺序执行任务
    AugularJS从入门到实践(三)
    AugularJS从入门到实践(二)
    用CSS实现响应式布局
    React+ANTD项目使用后的一些关于生命周期比较实用的心得
  • 原文地址:https://www.cnblogs.com/mailong/p/12013909.html
Copyright © 2011-2022 走看看