leetcode三数の和C++版

10989 ワード

タイトルの説明:
n個の整数を含む配列numsを与え,numsにa,b,cの3つの要素が存在するか否かを判断し,a+b+c=0とする.条件を満たし、繰り返さないすべての三元グループを見つけます.
注意:答えに重複する三元グループは含まれてはいけません.
  ,     nums = [-1, 0, 1, 2, -1, -4],

           :
[
  [-1, 0, 1],
  [-1, -1, 2]
]

一、暴力法は3回forサイクルを行い、条件を満たすすべての3つの数字の組み合わせを求めればよい.時間的複雑度が高く、O(n^3)
二、ポインタ法はまず1つの数字を固定し、他の2つの数字は最初から最後まで順次加算し、条件に合致するものを見つければよい.
C++コードは以下の通りです.
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res; //              
        sort(nums.begin(),nums.end());  // nums      
        int len = nums.size(); //      
        if (len < 3 ||nums[0] >0 || nums[len - 1] < 0) return {};//          
        for (int i = 0;i<len-1;i++){ //          
            int temp = nums[i];   //  temp            ,    
            int l = i+1;         
            int r = len -1;       
             if(i>0 && temp==nums[i-1])    continue; //                       
            while (l<r){
                if (nums[l]+nums[r] == -temp){
                       if (l == i+1 || r == len -1){
                           res.push_back(vector<int>{nums[i],nums[l],nums[r]});
                           l++;r--;
                       }
                        else if (nums[l] == nums[l-1]) l++;
                       else if(nums[r] == nums[r+1]) r--; //   continue   ,    
                     else{  
                         res.push_back(vector<int>{nums[i],nums[l],nums[r]});
                         l++;r--;
                     }
                    }
                
                else if (nums[l]+nums[r] < -temp) l++;
                else r--;
            }
        }
        return res;
    }
};