问题:三数之和
描述:
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。
范围:0≤n≤3000,数组中各个元素值满足 ∣val∣≤100
空间复杂度:O(n^2),时间复杂度 O(n^2)
注意:
- 三元组(a、b、c)中的元素可以按任意顺序排列。
- 解集中不能包含重复的三元组。
解题方法:
1、排序 + 双指针
思路:
首先,我们想到的就是直接3次遍历数组,分别确立满足第一个数,第二个数,第三个数,然后再利用一个容器将其存入,待所有的遍历结束后,再去重,进行输出。但是这样的时间复杂度和空间复杂度太高了。
题目中要求找到所有「不重复」且和为 0的三元组,这个「不重复」的要求使得我们无法简单地使用三重循环枚举所有的三元组。这是因为在最坏的情况下,数组中的元素全部为 0,即[0, 0, 0, 0, 0, ..., 0, 0, 0],任意一个三元组的和都为 0。如果我们直接使用三重循环枚举三元组,会得到 O(N^3) 个满足题目要求的三元组(其中 N是数组的长度)时间复杂度至少为 O(N^3)。在这之后,我们还需要使用哈希表进行去重操作,得到不包含重复三元组的最终答案,又消耗了大量的空间。这个做法的时间复杂度和空间复杂度都很高,因此我们要换一种思路来考虑这个问题。