LeetCode 15. 3Sum (预处理排序)

这道题我也觉得很棒,自己还是用的暴力的方法去做,然后就超时了啦,呜呜呜。。。

然后感叹一下讨论区的大佬真聪明。

Given an array nums of n integers, are there elements abc in nums such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

The solution set must not contain duplicate triplets.

Example:

Given array nums = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

先上个反面版本。。!!这个超时了。时了。了。。。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int m = nums.size();
        vector<vector<int> > sumOfTwo(m, vector<int>(m, 0));
        vector<vector<int> > res;
 
        int dup = 0;
        vector<int> Array(3,0);
        
        for(int k = 0; k < m; k++){
            for(int i = k + 1; i < m; i++){
                for(int j = i + 1; j < m; j++){
                    dup = 0;
                    sumOfTwo[i][j] = nums[i] + nums[j];
                    Array[0] = nums[k]; 
                    Array[1] = nums[i];
                    Array[2] = nums[j];
                    sort(Array.begin(), Array.end());
                    
                    for(int m = 0; m < res.size(); m++){ //这个查重超时了
                        if (res[m][0] == Array[0] && res[m][1] == Array[1] && res[m][2] == Array[2])
                            dup = 1;
                    }
                    
                    if (sumOfTwo[i][j] + nums[k] == 0  && dup == 0){ 
                              res.push_back(Array);
                    }
                }
            } 
        }
        
        return res;   
    }
     
};

接下来给大佬递茶:

解析:这个就是先排序一遍,再扫描,对于 3 Sum中的每一个数字:碰到一样的就跳过;

这个是双指针的算法,刷题到现在我的感觉就是:

扫描一遍做不出来答案,看看是不是DP和递归?

超时做不出来?看看双指针或者DP= =  好多预处理都是排序啊,排序赛高!!!


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++){
            int front = i + 1;
            int back = nums.size() - 1;
            int target = -1 * nums[i];
            
            while(front < back){
                int sum = nums[front] + nums[back];
                
                if(sum < target)
                    front++;
                else if(sum > target)
                    back--;
                else{
                    res.push_back({nums[i], nums[front], nums[back]});  //C++11万岁- -
                    
                    int tempFront = nums[front];
                    int tempBack = nums[back];
                    
                    while(front < back && nums[front] == tempFront)
                        front++;
                    while(front < back && nums[back] == tempBack)
                        back--;
                }
            }
            
            while(i+1<nums.size() && nums[i] == nums[i+1])
                i++;
        }
        
        return res;   
    }
     
};




猜你喜欢

转载自blog.csdn.net/qq_25175067/article/details/80441504