【LeetCode 15]三の数

トピックリンク

[説明]


最初のn個の昇順にデジタル数。
次に列挙トリプルi番目の桁の左端の数字。
二つのポインタLの後、Rは、数字の第二及び第三のトリプレットを移動取得します。
(初期値は、L = I + 1、R = N-1);
[I] + [L場合 ] + [R]> 0は
、2つの数値[L]と[R]の後ろに示すもあります大きいです。
これは数A [R]が小さくなるように大きかったです。
それr--の
それ以外の場合は、Lは、++することができます。
これは、1次元配列の2つの数値を見つけるために私たちを与え、タプルxの数のためのガイドラインを提供します。
そして、たとえリットル= 1、R = N
[L]であれば+ [R ]>のx 、その後、r--のみましょう。
そうでなければ、L.は++ましょう
(もちろん、前提はあなたが規則的な配列であるということです。だから、複雑さは、一種のに依存速度> _ <)である(移動する2つのポインタの複雑さはO(N)です)

[コード]

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int> > ans;
        vector<int> temp;
        temp.resize(3);
        sort(nums.begin(),nums.end());
        int len = nums.size();
        
        for (int i = 0;i < len;i++){
            if (i>0 && nums[i]==nums[i-1]) continue;//start 相同
            int l = i+1,r = len-1;
            while (l<r){
                if (nums[i]+nums[l]+nums[r]==0){
                    temp[0] = nums[i],temp[1] = nums[l],temp[2] = nums[r];
                    ans.push_back(temp);
                    while (l+1<len && nums[l+1]==nums[l]) l++;
                    while (r-1>i && nums[r-1]==nums[r]) r--;
                    l++;r--;
                }else if (nums[i]+nums[l]+nums[r]>0){
                    r--;
                }else {
                    l++;
                }
                
            }
        }
        return ans;
    }
};

おすすめ

転載: www.cnblogs.com/AWCXV/p/11808741.html