【LeetCode] 18と、4つの数

タイトル説明

与えられたn個の整数のアレイnumsと目標値をtarget、決定されるnums4つの要素は、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)固定最小abc=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行わなければなりません。時間複雑 ザ・ N リットル インクルード グラム N O(nlogn)
    • 上記溶液は、ポインタを移動する際に繰り返し回数が発生する可能性があるため、ソリューションの理由が重複します。私たちは、ポインタを移動することを確認する必要がありますので後は、
      対応する番号がああ仕事を変更します。

参照コード

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;
    }
};
415元記事公開 ウォンの賞賛603 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/ft_sunshine/article/details/104056232