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

脚本二及逻辑:

  • 此题的解答必定需要遍历所有的元素,此脚本是更细致地处理列表中地值,将那些不需要地元素剔除掉,减少遍历的次数

猜你喜欢

转载自www.cnblogs.com/mailong/p/12013909.html