【刷题记录】15. 三数之和
一、题目描述
来源:力扣(LeetCode)
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
示例 1:
示例 2:
示例 3:
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
二、思路分析
排序后,双指针解法
先对数组进行排序,排序后 如果存在,负数在左 正数在右的分布。
我们定义一个指针 num[i] 遍历这个排序后的数组
为了使三个数之和为 0 那肯定同时存在负数和正数,所以 num[i]确定的情况下,我们再定义两个指针(L,R)从两边开始遍历,使
L + num[i] + R == 0
即为一组三元组,遍历过程中:若和
大于 0
,说明R
太大,R
左移若和
小于 0
,说明L
太小,L
右移出现重复元素 跳过
不满足 L < R 结束
nums[i] > 0
因为已经排序好,所以后面不可能有三个数加和等于0
,直接返回数组为
null
或者数组长度小于3
, 直接返回
三、代码实现
复杂度分析
时间复杂度:,其中 n
是数组 nums
的长度
空间复杂度:, 指针使用常数大小的额外空间
运行结果
总结
这道题因为和为零 必定正负同时存在,所以我们排序后,在确定一个数的情况下,使用双指针追从俩边来进行遍历查找符合条件的数字是最直接快速点的。
这道题也算是个双指针运用的变形题目吧。
版权声明: 本文为 InfoQ 作者【WangNing】的原创文章。
原文链接:【http://xie.infoq.cn/article/529bb2e760e57414b7726f0c9】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论