LeetCode 15. 3Sum 3及び数

トピックリンク:こちらをクリックしてください
ここに画像を挿入説明

キーソリューションが出てマーキングを繰り返し、マップを削除することです。

日本語文、長さが少ない配列を超える場合 3 3 、リターン [   ] [\]

配列をソートします。

最初の桁の列挙 n個 メートル S [ ] NUMS [I] 、2桁を見つけるために二重ポインタ n個 メートル S [ L ] NUMS [L] 及び n個 メートル S [ R ] NUMS [R]

  • もし n個 メートル S [ ] > 0 NUMS [I]> 0 :それはソートされているので、3に等しいが存在することはできず、数など 0 0 、終了します。
  • 要素を繰り返す:複製ソリューションを避けるために、スキップ

左ポインタを作ります L = + 1 L = I + 1 、右ポインタ R = n個 - 1 R = N-1 、とき L < R L <R 、実行サイクル:

  • とき n個 メートル S [ ] + n個 メートル S [ L ] + n個 メートル S [ R ] = = 0 NUMS [I] + NUMS [L] + NUMS [R] == 0 、実行サイクルか否か左境界と次の反復の右境界位置、重複除外ソリューションを決定します。そして同時に L , R L、R 次の位置に、新たなソリューションを探して
  • 大きい場合は 0 0 を示し、 n u m s [ R ] NUMS [R] すぎます、 R R
  • 未満の場合 0 0 を示し、 n u m s [ L ] NUMS [L] が小さすぎます、 L L
class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        sort(nums.begin(), nums.end());
        int n = nums.size();
        
        for(int i = 0; i < n; ++i)
        {
            if(nums[i] > 0)	break;	//若此处大于0,后面不可能找到负数了
            if(i > 0 && nums[i] == nums[i-1])   continue;	//去重 
            
            int pivot = -nums[i];
            int L = i + 1, R = n - 1;
            
            while(L<R)
            {
                if(nums[L]+nums[R]==pivot)
                {
                    ans.push_back({nums[i],nums[L],nums[R]});
                    ++L;
					--R; 
                    while(L < R && nums[L] == nums[L-1])
                    	++L;
                    while(L < R && nums[R] == nums[R+1])
                    	--R;
                }
                else if(nums[L]+nums[R] < pivot)
                {
                    ++L;
                }
                else
                {
                    --R;
                }
            }
        }
        return ans;
    }
};
公開された727元の記事 ウォンの賞賛111 ビュー120 000 +

おすすめ

転載: blog.csdn.net/qq_42815188/article/details/104317971