题意
定义一个三元组为$a+b+c = 0$,从包含$n$个整数的数组中,找出所有满足条件的不重复三元组。
思路
想法1:暴力,$O(n^3)$。
想法2:用“桶”记录下每个数值出现的次数,遍历前两个数,判断第三个数是否存在。时间复杂度:$O(n^2)$,空间复杂度:$O(n)$。
想法3:排序 + 双指针。排序后从小到大遍历数组,具体判断情况如下:
nums[i] > 0
,后面不可能有三个数之和为0,结束循环。- 重复元素跳过,避免重复解。
- 令左指针
L = i + 1
,右指针R = n - 1
,当$L \lt R$时,执行如下循环:nums[i] + nums[L] + nums[R] ==0
,判断边界位置是否和下一位置重复,若重复则去重。记录答案,将$L、R$移到下一位置。- 三数之和大于0,R左移。
- 三数之和小于0,L右移。
时间复杂度:$O(n^2)$,空间复杂度:$O(n)$。
代码
1 | class Solution { |
总结
这种找数字的很多都涉及到了排序,利用有序可以加快查找速度。