返回

数组三数之和:寻找组成和为零的三个数

前端

算法详解

三数之和问题可以用多种方法解决。其中,一种有效且常用的算法是排序 + 双指针法。它的基本思想是:

  1. 首先,将数组进行升序排列。
  2. 然后,选择一个元素作为基准元素。
  3. 接着,使用两个指针从基准元素的左右两侧向中间移动,同时计算三数之和。
  4. 如果三数之和等于零,则找到一个解。
  5. 如果三数之和小于零,则左指针向右移动。
  6. 如果三数之和大于零,则右指针向左移动。
  7. 重复步骤3-6,直到找到所有可能的解。

代码实现

def threeSum(nums):
  """
  :type nums: List[int]
  :rtype: List[List[int]]
  """
  # 排序数组
  nums.sort()

  # 结果列表
  result = []

  # 遍历数组
  for i in range(len(nums) - 2):
    # 跳过重复元素
    if i > 0 and nums[i] == nums[i - 1]:
      continue

    # 左指针和右指针
    left, right = i + 1, len(nums) - 1

    # 移动指针
    while left < right:
      # 计算三数之和
      sum = nums[i] + nums[left] + nums[right]

      # 如果三数之和等于零,则找到一个解
      if sum == 0:
        result.append([nums[i], nums[left], nums[right]])

        # 跳过重复元素
        while left < right and nums[left] == nums[left + 1]:
          left += 1
        while left < right and nums[right] == nums[right - 1]:
          right -= 1

        # 移动指针
        left += 1
        right -= 1

      # 如果三数之和小于零,则左指针向右移动
      elif sum < 0:
        left += 1

      # 如果三数之和大于零,则右指针向左移动
      else:
        right -= 1

  # 返回结果
  return result

复杂度分析

该算法的时间复杂度为O(n^2),其中n是数组的长度。

结语

三数之和问题是一个经典算法问题,在许多领域都有广泛的应用。本文介绍了一种使用排序 + 双指针法来解决该问题的有效算法。掌握这种算法可以帮助您解决各种实际问题。