トピックの評価:4Sum(ミディアム)
件名の説明:
アレイ所与nums
のn個の整数と整数target
、要素がある、B、C、およびDになるよう+ B + C + D = ?の合計を与え、アレイ内のすべてのユニークな四つ組を探します。nums
target
target
注意:
ソリューションセットは、重複四つ組を含めることはできません。
例:
Given array nums = [1, 0, -1, 0, -2, 2], and target = 0.
A solution set is:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
問題の意味:、nは整数NUMS目標と目標値を含む配列を考えるは+ B + C + Dが目標の値に等しくなるように、そこに四つの要素は、B、Cであり、そしてDのNUMSか否かを判断しますか?すべてのクワッドの条件を満たし、繰り返さない特定します。
問題解決のアイデア:
これは特別なもの、の3人のデジタル和を直接参照しない。[15] LeetCode 3と0の数
他の特定のソリューションが見つからないオンライン、2つずつの合計に半分の方法を使用して、あまりにも面倒に感じ、直感的ではない、とここでは、外側の層と3プラスの数に直接使用されることがありますされます1サイクルが、時間複雑である:O(N ^ 3)。
次に、このような練習は主に要約を作成するには:
二つの数字と範囲、練習:
- :HashMapを使用して、配列を乱れている場合を参照[1] LeetCode、二つの数
- :注文した配列、両手は、を参照している場合、安全性のオファーを証明するために、[42]、および二つの数S
三と(N合計数)列の練習の数:
- ステップ:java.util.Arrays.sort([] NUMSをINT)、昇順
- 第二段階:重複排除のために近い中心にアレイのwhileループの双方向ポインタ後のループのN-2層に加え、2つの双方向ポインタ、二つの円がループしながら、ネストしながら、
class Solution {
public List<List<Integer>> fourSum(int[] nums, int target) {
List<List<Integer>> res=new ArrayList<>();
if(nums==null && nums.length==0)
return res;
Arrays.sort(nums);
int len=nums.length;
for(int i=0;i<len-3;i++){
if(i>0 && nums[i-1]==nums[i]) //跳过重复的
continue;
for(int j=i+1;j<len-2;j++){
if(j>i+1 && nums[j]==nums[j-1]) //跳过重复的
continue;
int low=j+1,high=len-1,sum=target-nums[i]-nums[j];
while(low<high){
if(nums[low]+nums[high]==sum){ //找到一个解
res.add(Arrays.asList(nums[i],nums[j],nums[low],nums[high]));
while(low<high && nums[low+1]==nums[low])
low++;
while(low<high && nums[high-1]==nums[high])
high--;
low++;
high--;
}else if(nums[low]+nums[high]<sum)
low++;
else
high--;
}
}
}
return res;
}
}