LeetCode 图解 | 15. 三数之和

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

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

示例

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]最容易想到的就是三重循环暴力法搜索,时间复杂度为 O(n^3). 有点高啊,优化一下.

通过题目我们了解到,主要问题在于 搜索所有满足条件的情况 和 避免重复项,那么我们可以使用 升序数组 + 双指针 有效处理问题并降低时间复杂度.

你可能想知道为啥会选择使用这个方案 ?

首先数组排序时间复杂度可以达到 O(NlogN),这点时间消耗我们是能接受的,另外根据有序数组的特性,数组重复项会挨在一起,不需要额外的空间存储就能跳过重复项,由于是升序,当发现最左边的数值大于0,就可以及时跳出来结束运算.

双指针可以用来降维. 通过遍历数组,取当前下标值为定值,双指针代表定值后面子数组的首尾数值,通过不断靠近双指针来判断三个值的和。

具体算法流程如下:

特判:对于数组长度 n,如果数组为 null 或者数组长度小于 3,返回[ ] ;
数组升序排序;
遍历数组:
当 nums[i] + nums[L] + nums[R] == 0 ,执行循环,判断左指针和右指针是否和下一位置重复,去除重复解。并同时将 L,R 移到下一位置,寻找新的解;
若和大于 0,说明 nums[R] 太大,R指针 左移
若和小于 0,说明 nums[L] 太小,L指针 右移
若 num[i] > 0:因为是升序,所以结果不可能等于0,直接返回结果;
令左指针 L = i + 1,右指针 R = n - 1,当 L < R 时,执行循环

具体代码,以及图解分析,请看原文
https://mp.weixin.qq.com/s?__biz=MzI3NzIwMjk4OA==&mid=2247484032&idx=1&sn=f89b6db9688eb4b62580b7a06044d7a3&chksm=eb6893c3dc1f1ad524715621231fc36f93316b9602c39b9fe81cdfe6caae561f6483ee6078da&mpshare=1&scene=23&srcid=&sharer_sharetime=1589547179862&sharer_shareid=ac11f0b33b3f01f55650b6c5eeb96ac0#rd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值