タイトル説明
与えられたn個の整数のアレイnums
と目標値をtarget
、決定されるnums
4つの要素は、B、CおよびDがあるかどうか、その結果A + B + C + Dの値とtarget
等しいですか?クワッドの条件を満たし、繰り返さないすべて特定します。
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
問題解決のためのアイデア
ゴーCSDNの「合計」を検索し、あなたが同様の問題を見ることができます。
この質問15、トリプルの数基礎プラスの層for
循環が、考え方は同じです。
- +ダブルポインタを並べ替え:
- 4つのポインタを使用してください
(a<b<c<d)
。固定最小a
とb
上c=b+1
左、d=_size-1
、。解決二つのポインタは、サンドイッチを移動します。保存は可能nums[a]+nums[b]+nums[c]+nums[d]==target
ソリューションを。ときは大きすぎるとd
左、とき小さなc
右。c
そして、d
会ったとき、現在の中で発現a
し、b
全溶液の最小値は、得られたb++
次にb
、サイクルの場合b
、ループの終わりa++
、次のもののa
サイクル。すなわち、(a
ネストされている最も外側のループ、b
ループ、再びネストされた二重ポインタc,d
解決挟ま)。 - ダブルポインタ方式を使用するには、ソートは〜DER行わなければなりません。時間複雑 。
- 上記溶液は、ポインタを移動する際に繰り返し回数が発生する可能性があるため、ソリューションの理由が重複します。私たちは、ポインタを移動することを確認する必要がありますので後は、
対応する番号がああ仕事を変更します。
- 4つのポインタを使用してください
参照コード
class Solution{
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int> > res;
if(nums.size()<4)
return res;
sort(nums.begin(),nums.end());
int a, b, c, d, _size = nums.size();
for(a = 0; a <= _size-4; a++){
if(a > 0 && nums[a] == nums[a-1])
continue; //确保nums[a] 改变了
for(b = a+1; b <= _size-3; b++){
if(b > a+1 && nums[b] == nums[b-1])
continue; //确保nums[b] 改变了
c = b + 1, d = _size - 1;
while(c < d){
if(nums[a]+nums[b]+nums[c]+nums[d] < target)
c++;
else if(nums[a]+nums[b]+nums[c]+nums[d] > target)
d--;
else{
res.push_back({nums[a], nums[b], nums[c], nums[d]});
while(c < d && nums[c+1]==nums[c]) //确保nums[c] 改变了
c++;
while(c < d&&nums[d-1]==nums[d]) //确保nums[d] 改变了
d--;
c++;
d--;
}
}
}
}
return res;
}
};