Leetcode典型题解答和分析、归纳和汇总——T15(三数之和)

题目描述:

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

题目解析:

本题的实质类似于两数之和,比较简单,采用双指针的方式可以实现。但要主要去掉重复的元组。

具体思路:先对数组nums进行升序排列,然后再确定当前元素(cur),左右指针(left、right)双指针移动,找到满足nums[cur]=nums[right]+nums[right]条件的三元组。如果不满足,则使得指针左右移动即可。

class Solution{
    public:
    vector<vector<int>> threeSum(vector<int>& nums){
        sort(nums.begin(),nums.end()); //对数组进行顺序排序
        //降序排列的方式为:sort(nums.rbegin(),nums.rend())
        int N = nums.size();
        vector<vector<int>> res; //用来保存中间结果
        if(N<=2) return res;
        for(int i=0;i<N-2;i++)   //进行下标索引所设置
        {
            int cur = nums[i];   //表示当前值
            if(cur>0)  break;   //从第一个负值开始

            int curNeg = 0-cur;   //进行取反,为正数

            int left = i+1, right = N-1;  
            while(left<right)  //左指针小于右指针条件
            {
                int leftVal = nums[left], rightValue=nums[right];

                if(leftValue+rightValue==curNeg)
                {
                    vector<int> tmpVec{cur,leftValue,rightValue};
                    res.push_back(tmpVec); //把满足条件的数组进栈
                    //去除重复的三元组
                    while(left<right&&nums[left]==leftValue)
                    {
                        left++;
                    }
                    while(left<right&&nums[right]==rightValue)
                    {
                        right--;
                    }
                }
                else if(leftValue+rightValue<curNeg) left++;
                else if(leftValue+rightValue>curNeg) right--;

                //去重
                while(i+1<N-2&&nums[i]==nums[i+1]) i++;
            }
            
        }
        return res;
    }
};
发布了56 篇原创文章 · 获赞 7 · 访问量 4494

猜你喜欢

转载自blog.csdn.net/weixin_44504987/article/details/104279429