加载中...
15-三数之和(3Sum)
发表于:2021-12-03 | 分类: 中等
字数统计: 301 | 阅读时长: 1分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/3sum

英文原文

Given an integer array nums, return all the triplets [nums[i], nums[j], nums[k]] such that i != j, i != k, and j != k, and nums[i] + nums[j] + nums[k] == 0.

Notice that the solution set must not contain duplicate triplets.

 

Example 1:

Input: nums = [-1,0,1,2,-1,-4]
Output: [[-1,-1,2],[-1,0,1]]

Example 2:

Input: nums = []
Output: []

Example 3:

Input: nums = [0]
Output: []

 

Constraints:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

中文题目

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

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

 

示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

示例 2:

输入:nums = []
输出:[]

示例 3:

输入:nums = [0]
输出:[]

 

提示:

  • 0 <= nums.length <= 3000
  • -105 <= nums[i] <= 105

通过代码

高赞题解

排序 + 双指针

本题的难点在于如何去除重复解。

算法流程:

  1. 特判,对于数组长度 $n$,如果数组为 $null$ 或者数组长度小于 $3$,返回 $[]$。

  2. 对数组进行排序。

  3. 遍历排序后数组:

    • 若 $nums[i]>0$:因为已经排序好,所以后面不可能有三个数加和等于 $0$,直接返回结果。

    • 对于重复元素:跳过,避免出现重复解

    • 令左指针 $L=i+1$,右指针 $R=n-1$,当 $L<R$ 时,执行循环:

      • 当 $nums[i]+nums[L]+nums[R]==0$,执行循环,判断左界和右界是否和下一位置重复,去除重复解。并同时将 $L,R$ 移到下一位置,寻找新的解

      • 若和大于 $0$,说明 $nums[R]$ 太大,$R$ 左移

      • 若和小于 $0$,说明 $nums[L]$ 太小,$L$ 右移

复杂度分析

  • 时间复杂度:$O\left(n^{2}\right)$,数组排序 $O(N \log N)$,遍历数组 $O\left(n\right)$,双指针遍历 $O\left(n\right)$,总体 $O(N \log N)+O\left(n\right)*O\left(n\right)$,$O\left(n^{2}\right)$

  • 空间复杂度:$O(1)$

[-Python3]
class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: n=len(nums) res=[] if(not nums or n<3): return [] nums.sort() res=[] for i in range(n): if(nums[i]>0): return res if(i>0 and nums[i]==nums[i-1]): continue L=i+1 R=n-1 while(L<R): if(nums[i]+nums[L]+nums[R]==0): res.append([nums[i],nums[L],nums[R]]) while(L<R and nums[L]==nums[L+1]): L=L+1 while(L<R and nums[R]==nums[R-1]): R=R-1 L=L+1 R=R-1 elif(nums[i]+nums[L]+nums[R]>0): R=R-1 else: L=L+1 return res

统计信息

通过次数 提交次数 AC比率
721208 2121931 34.0%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
两数之和 简单
最接近的三数之和 中等
四数之和 中等
较小的三数之和 中等
上一篇:
13-罗马数字转整数(Roman to Integer)
下一篇:
14-最长公共前缀(Longest Common Prefix)
本文目录
本文目录