[LeetCode.15]三数之和

自己的解法:

先排序->分大于零和小于等于零两个部分->取任一一个部分中的两个数->再在另一个部分取一个数匹配是否等于0(0+0+0=0已单独讨论)

出现的问题:运行到311/313测试用例时出现TLE。

class Solution
{
public:
	vector<vector<int>> threeSum(vector<int>& nums)
	{
		set<vector<int>> v;
		sort(nums.begin(), nums.end());
		int block = -1;
                int countZero=0;
		for (int i = 0; i<nums.size(); i++)
		{
			if (nums[i]>0)
			{
				block = i;
				break;
			}
                if(nums[i]==0)
                    countZero+=1;
		}
                if(countZero>=3)
                {
                    v.insert({0,0,0});   
                }
		for (int i = 0; i<block - 1; i++)
		{
			for (int j = i + 1; j<block; j++)
			{
				for (int k = block; k<nums.size(); k++)
				{
					if (nums[i] + nums[j] + nums[k] == 0)
					{
                                            v.insert({nums[i],nums[j],nums[k]});
                                            break;
					}
				}
			}
		}
		for (int i = block; i<nums.size() - 1; i++)
		{
			for (int j = i + 1; j<nums.size(); j++)
			{
				for (int k = 0; k<block; k++)
				{
					if (nums[i] + nums[j] + nums[k] == 0)
					{
						v.insert({nums[i],nums[j],nums[k]});
                                                break;
					}
				}
			}
		}
		return vector<vector<int>>(v.begin(),v.end());
	}
    
};

对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了,然后我们还要加上重复就跳过的处理,对于遍历到的数,我们用0减去这个数得到一个sum,我们只需要再之后找到两个数之和等于sum即可,这样一来问题又转化为了求two sum,这时候我们一次扫描,找到了等于sum的两数后,加上当前遍历到的数字,按顺序存入结果中即可,然后还要注意跳过重复数字。代码如下:

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

参考自:https://www.cnblogs.com/grandyang/p/4481576.html

如有不当之处,请联系我:[email protected]

猜你喜欢

转载自blog.csdn.net/weixin_39460182/article/details/80209214