LeetCode-15 三数之和
LeetCode-15 三数之和
题目描述
给你一个包含 n
个整数的数组 nums
,判断 nums
中是否存在三个元素 a,b,c
,使得 a + b + c = 0
?请你找出所有和为 0
且不重复的三元组。
注意:答案中不可以包含重复的三元组。
数据样例
示例 1:
1 | 输入:nums = [-1,0,1,2,-1,-4] |
示例 2:
1 | 输入:nums = [] |
示例 3:
1 | 输入:nums = [0] |
提示:
- $0 \leq nums.length \leq 3000$
- $-10 ^ 5 \leq nums[i] \leq 10 ^ 5$
双指针 - $O(N ^ 2)$
两数之和
首先,我们可以回顾一下如何利用双指针算法求解两数之和:
两数之和:序列寻找 $a + b = 0$
- 将序列进行排序为递增有序序列
- 指针 $i$ 从序列 左侧 开始向右侧移动
- 指针 $j$ 从序列 右侧 开始向左侧移动
双指针算法:
- 当前如果 $nums[i] + nums[j] \geq 0$,则指针 $j$ 向左侧移动
- 当前如果 $nums[i] + nums[j] < 0$,则指针 $i$ 向右侧移动
算法如下图所示:
- $nums[i’] + nums[j’] > nums[i] + nums[j]$ 可以知道 $j$ 每次不需要从尾部开始重新枚举
三数之和
两数之和双指针算法理解后,三数之和就容易多了。
对于三数之和,我们可以固定一个值:
- 枚举所有可能的 $a$ 的值
此时问题可以转换成:$b + c + a = 0$,其中 $a$ 是一个固定的值
那么这个问题就转换成了 两数之和
- 分别用两个指针 $i, j$ 记录当前 $b, c$ 的值即可
不重复三元组
处理不重复三元组,只需要枚举过程中,如果 当前元素的值和前面的值相同(nums[i] == nums[i - 1]
)则跳过,具体见代码注释。
时间复杂度 - $O(N ^ 2)$
- 需要枚举一遍所有可能的 $a$:$O(N)$
- 双指针求解两数之和 $b + c + a = 0$:$O(N)$
因此整体时间复杂度为 $O(N ^ 2)$
代码
1 | func threeSum(nums []int) [][]int { |
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cat's Blog!
评论