zoukankan      html  css  js  c++  java
  • leetcode15 三数之和

    Problem:

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

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

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

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/3sum

    Answer:

    类似于16题:最接近的三数之和,但是需要去除重复的三元组。

    首先对数组进行排序,然后对于固定的下标i(0到size - 1),用双指针对i右侧的数进行搜索,注意当三数之和等于0时,还要继续搜索,

    如[0, -2, -1, 1, 2],(0, -2, 2)和(0, -1, 1)和都为0.

    避免重复:

    当nums[i] == nums[i - 1]或nums[left] == nums[left - 1]或nums[right] == nums[right + 1]时,跳过即可。

    另外当nums[i] > 0时,由于排序后i后面的数更大,所以和肯定大于0。

    Code:

     1 class Solution:
     2     def threeSum(self, nums: List[int]) -> List[List[int]]:
     3         res = []
     4         nums.sort()
     5         nums_len = len(nums)
     6         for i in range(nums_len):
     7             if nums[i] > 0:
     8                 break
     9             if i > 0 and nums[i] == nums[i - 1]:
    10                 continue
    11             left = i + 1
    12             right = nums_len - 1
    13             while left < right:
    14                 if left > i + 1 and nums[left] == nums[left - 1]:
    15                     left += 1
    16                     continue
    17                 if right < nums_len - 1 and nums[right] == nums[right + 1]:
    18                     right -= 1
    19                     continue
    20                 sum_ = nums[i] + nums[left] + nums[right]
    21                 if sum_ == 0:
    22                     res.append([nums[i], nums[left], nums[right]])
    23                     left += 1
    24                     right -= 1
    25                 elif sum_ > 0:
    26                     right -= 1
    27                 else:
    28                     left += 1
    29         return res

    Reference:

    https://leetcode-cn.com/problems/3sum/solution/3sumpai-xu-shuang-zhi-zhen-yi-dong-by-jyd/

  • 相关阅读:
    第三方支付
    优化MySQL插入方法的五个妙招
    MySQL的数据类型和建库策略详解
    mysql 文本搜索
    mysql 存储过程
    mysql 游标的使用
    mysql 触发器
    mysql 保留点
    MySQL 使用硬链接配合truncate 删除2.2T的表
    25-ZigZag Conversion
  • 原文地址:https://www.cnblogs.com/lxc1910/p/11337906.html
Copyright © 2011-2022 走看看