15.三数之和

题目:15.三数之和
在两数之和的基础上实现,先枚举x在进行目标值为target-x的两数之和。注意要去除重复的x和重复的y,z。当然也可以使用set集合的互异性来去重。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        //先进行排序,便于去除重复x,y,z
        sort(nums.begin(),nums.end());
        //nums.rbegin(),nums.rend()可实现反向排序
        for(int i=0;i<nums.size();i++){//枚举x
            if(i>0&&nums[i]==nums[i-1])continue;//此处是为了去除重复的x  剪枝
            int left=i+1,right=nums.size()-1;//取左右端点。
            //-4 -1 -1 0 1 2
            while(left<right){
                int sum=nums[left]+nums[right]+nums[i];
                if(sum==0){
                    ans.push_back({nums[left],nums[right],nums[i]});
                    right--;left++;
                    while(left<right&&nums[left]==nums[left-1])left++;//去除相同的y  剪枝
                    while(left<right&&nums[right]==nums[right+1])right--;//去除相同的z  剪枝
                }
                else if(sum>0)right--;
                else left++;  
            }
        }
        return ans;
    }
};

假设使用set集合的话,需要对ans(set<vector> ans)压入的{nums[left],nums[right],nums[i]}进行排序,然后将其压入ans。最后还要set<vector>转成vector<vector>(因为返回值要求是vector<vector>)实现了去重但是时间复杂度偏高,在没有剪枝的情况下,既引入了排序操作,又引入了set插入是的查询操作。所以时间复杂度同样是O(N^2)的情况下,用时是上面方法的十几倍。内存更是上百倍。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        set<vector<int>> ans;
        vector<vector<int>> realAns;
        sort(nums.begin(),nums.end());
        //nums.rbegin(),nums.rend()可实现反向排序
        for(int i=0;i<nums.size();i++){//枚举x
            int left=i+1,right=nums.size()-1;//取左右端点。
            //-4 -1 -1 0 1 2
            while(left<right){
                int sum=nums[left]+nums[right]+nums[i];
                if(sum==0){
                    vector<int> temp={nums[left],nums[right],nums[i]};
                    ans.insert(temp);
                    right--;left++;
                }
                else if(sum>0)right--;
                else left++;  
            }
        }
        for(auto c:ans){
            realAns.push_back(c);
        }
        return realAns;
    }
};
posted @ 2025-03-25 15:34  Cheauncey  阅读(59)  评论(0)    收藏  举报