説明は
NUMS n個の整数の配列を考えると、三つの要素NUMSよう+ B + C = 0 C、A、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注:答えは重複したトリプルを含めることはできません。
例
のアイデア
あなたは2とアイデアの数を参照することができます。
- 二つや辞書の数(不適切同じ番号は、複数の組み合わせが必要、及び第二の数及び必要唯一の答えであってもよいので、)そのような心配がありません
一人一人のために、この時点で外観に二人目を引くために第三者が2つの数の和となる二人目が必要な場合には、第2の人が必要とされていない場合は、直接出力に、それは(辞書で満たされています必要とされない第1、第2個人):D [0-最初のもの - 二人] = [一人称、二人称]
- ポインタと2本のビスの数(ポインタの良いを移動する方法を決定するために、並べ替えの必要性)勧告
ソートに、アレイを介して、各番号のため、二つのポインタ取る、Bは、数あるの後、数が目標よりも<B、及びもし大きい、順転写B場合、最後のものです、 、バック調整対象未満の場合、およびターゲットのために、この組成物は結果に追加された場合
避ける複製トリックへ:
- 数として現在の数は、スキップされた場合、外側ループは、と、選択の数よりも少ない数の選択は、直接包含するため
- 回答のセットを見つけるのは、内側ループについて、NUMS [A] == NUMS [+ 1]は、スキップ場合NUMS [B] === NUMS [B-1]は、B-1をスキップした場合+ 1、NUMS [I]は、それが省略されてもよい、同じ数は、これらの組み合わせを繰り返すこと数、続いて決定されているので
計算の削減:
- もしNUMS [I] + NUMS [I + 1] + NUMS [I + 2]> 0ブレーク位又はNUMS [I]> 0の場合、外側のループが終了します。最小数> 0、0よりも3及びそれ以上の和、及びNUMSより後者の数[I]が大きい場合、組成物は、後者の問題を有しています
- NUMSなら[I] + NUMS [N -1] + NUMS [N-2] <ターゲットは#続行直接次のターゲット番号の組み合わせの最大数よりも少ない
答え
- パイソン
class Solution:
def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()#方便去重
res = []
n=len(nums)
for i in range(n-2):
if i>0 and nums[i]==nums[i-1]:
continue
if nums[i]+nums[i+1]+nums[i+2] > 0:#或者nums[i]>0
break #最小的数>0,则三数之和大于0,且后面的数都比nums[i]大,则后面的组合都有问题,
if nums[i]+nums[n-1]+nums[n-2]<0: continue
a, b = i+1, n - 1
while a <b:
t = nums[a] + nums[i] + nums[b]
if t < 0:
a += 1
if t > 0:
b -= 1
if t == 0:
res.append([nums[i], nums[a], nums[b]])
while a<b and nums[b]==nums[b-1]:
b-=1
while a<b and nums[a]==nums[a+1]:
a+=1
a+=1
b-=1
return res
- C ++
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int>> v;
int n=nums.size();
for (int i=0; i<n-2; i++)
{
int a=i+1,b=nums.size()-1;
if (i>0 && nums[i]==nums[i-1]) continue;
if (nums[i]+nums[i+1]+nums[i+2]>0) break;//==nums[i]>0最小的数>0,则三数之和大于0,且后面的数都比nums[i]大,则后面的组合都有问题,
if (nums[i]+nums[n-1]+nums[n-2]<0) continue;
while (a<b)
{
int t = nums[i]+nums[a]+nums[b];
if (t<0) a++;
if (t>0) b--;
if (t==0)
{
vector<int> temp = {nums[i],nums[a],nums[b]};
v.push_back(temp);
while (a<b && nums[b]==nums[b-1]) b--;
while (a<b && nums[a]==nums[a+1]) a++;
a++;
b--;
}
}
}
return v;
}
};