题解 | #数组中相加和为0的三元组#

数组中相加和为0的三元组

http://www.nowcoder.com/practice/345e2ed5f81d4017bbb8cc6055b0b711

数组中相加和为0的三元组

1、题意重述

给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

换句话说,即从数组S中找3个数,并且这3个数相加为0.

2、思路整理

使用双指针的思想:

Step1:(首先排序,在这里排序使用快排,直接出结果即可)固定一个数,另外两个数用双指针指向。我们设l,r两个指针,分别指向固定数的后一个数和数组中的最后一个数

alt

Step2:判断l,r指针指向数值的和与固定值的相反数进行比较。

①如果num[l] + num[r] == -num[i],返回结果

②如果num[l] + num[r] > -num[i] 则r--

③如果num[l] + num[r] < -num[i] 则l++

alt

Step3:将固定的数往右移动,重复Step2操作,最后得出结果。

alt

3、代码实现

class Solution {
public:
    vector<vector<int> > threeSum(vector<int> &num) {
        vector<vector<int>>ans;
        if(num.size()<3)return ans;
        sort(num.begin(),num.end());
        for(int i=0;i<num.size()-2;i++){
            if(num[i]==num[i-1]&&i)continue;
            int l=i+1,r=num.size()-1;
            while(l<r){
                if(num[l]+num[r]==-num[i]){
                   ans.push_back({num[i],num[l],num[r]});
                    while(num[l]==num[l+1]&&l+1<r)l++;
                    while(num[r]==num[r-1]&&r-1>l)r--;
                    l++,r--;
                }
                else if(num[l]+num[r]>-num[i]){
                    r--;
                }
                else l++;
            }
        }
        return ans;
    }
};

4、复杂度分析

时间复杂度:遍历数组加双指针遍历,因此时间复杂度为O(N2)O(N^2)

空间复杂度:使用常数级内存地址空间,因此空间复杂度为O(1)O(1)

22年春节特别专栏_双指针 文章被收录于专栏

双指针题解,图片随便找的!

全部评论

相关推荐

要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务