力扣15. 三数之和

Posted 幽殇默

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣15. 三数之和相关的知识,希望对你有一定的参考价值。

在这里插入图片描述
题目链接
最后两点TLE做法

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        map< vector<int> , bool > mp; 
        unordered_map<int,int>hush;
        vector<vector<int>> ans;
	    for(int i=0;i<nums.size();i++) hush[nums[i]]++;
	    for(int i=0;i<nums.size();i++)
	    {
		    for(int j=i+1;j<nums.size();j++)
		    {
			    int k=0-nums[i]-nums[j];
			    hush[nums[i]]--;
			    hush[nums[j]]--;
			    if(hush[k])
			    {
                    int s1=nums[i],s2=nums[j],s3=k;
                    if(s1>s2) swap(s1,s2);
                    if(s2>s3) swap(s2,s3);
                    if(s1>s2) swap(s1,s2);
				    if(!mp[{s1,s2,s3}]) ans.push_back({s1,s2,s3}),mp[{s1,s2,s3}]=true;
			    }
			    hush[nums[i]]++;
			    hush[nums[j]]++;
		    }
	    }
	    return ans;
    }
};

正解:先排序再双指针
在这里插入图片描述
这里需要注意的是去重,如果nums[i]==nums[i-1]说明其和上次的结果是一样的直接跳过,同理nums[j]==nums[j-1]说明结果和上次是一样的

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

y总代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i ++ ) {
            if (i && nums[i] == nums[i - 1]) continue;
            for (int j = i + 1, k = nums.size() - 1; j < k; j ++ ) {
                if (j > i + 1 && nums[j] == nums[j - 1]) continue;
                while (j < k - 1 && nums[i] + nums[j] + nums[k - 1] >= 0) k -- ;//区别
                if (nums[i] + nums[j] + nums[k] == 0) {
                    res.push_back({nums[i], nums[j], nums[k]});
                }
            }
        }

        return res;
    }
};

以上是关于力扣15. 三数之和的主要内容,如果未能解决你的问题,请参考以下文章

力扣算法JS LC [383. 赎金信] LC [15. 三数之和]

力扣15. 三数之和

力扣15. 三数之和

❤️导图整理数组4: 三数之和 相比于 两数之和 的难点, 力扣15❤️

精选力扣500题 第9题 LeetCode 15. 三数之和 c++详细题解

力扣15. 三数之和 双指针+排序 滑动易懂解法