[説明]
最初の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;
}
};