leetcode 15 三数之和

暴力算法必须贴,虽然超时了,但我真的觉得是个好办法

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

  排序是个好思路,先把所有数据从小到达排序,进行第二个循环的时候b和c可以同步进行,一个从前往后,一个从后往前

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) 
    {
        vector<vector<int>> result;
        int n = nums.size();
        if(n<=2)
        return result;
        sort(nums.begin(),nums.end());
        vector<int> temp;
        int i = 0;
        for(int i = 0 ; i < n-2 ; i++)         //第一位不一样
        {
            if(i > 0 && nums[i] == nums[i-1])
            continue;
            int k = n-1;
            for(int j = i+1 ; j < n-1 ; j++)   //对j循环
            {
                if(j > i+1 && nums[j] == nums[j-1])           //保证第二个数不重复
                continue;
                while(j < k && nums[i]+nums[j]+nums[k]>0)
                {
                    k--;
                }
                if(j == k)
                break;
                if(nums[i]+nums[j]+nums[k] == 0)
                result.push_back({nums[i],nums[j],nums[k]});
            }            
        }
        return result;
    }
};

  

leetcode 15 三数之和

上一篇:02梯度下降算法


下一篇:细数改善WPF应用程序性能的10大方法