タイトル
配列NUMS nは、整数を含む所定のは、3つの要素は、C NUMSよう+ B + C = 0、Bが存在するか否かを判断しますか?すべての条件が重複したトリプルを見つけることは満足していません。
注意:答えは重複したトリプルを含めることはできません。
例えば、アレイのNUMS =所与[-1、0、1 、2、-1、-4]、
のようなトリプルのセットの要件を満たす:
[
[-1、0、1]、
[-1、-1、 2]
]
考え
この質問はかなり難しい、実際には、非常に単純なように見えます。しかし、まだ一般的な方法は、それがソートされません。最初のソート、アイデアが来ました。
まず、我々は明確にする必要があり、数3と0は、その後、0であるか、少なくとも負の数。私たちは、この非ポジティブに誰かを見つけることができます。正端に通過します。また、繰り返しをスキップするように注意してください。トラバース修正の数を設定します。
0修正を減算することにより、続いて、残りの二つの数とターゲットを得ます。
最後のステップは、修正後のアレイを横断すると、数2のターゲットを見つけるために、これら2つの数値を一緒に保存し直すです。それでも繰り返しスキップする注意を払います。
コード
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> res = new ArrayList<List<Integer>>();
for(int i = 0; i<nums.length; i++){
//后面的数都大于0则不可能有和为0
if(nums[i] > 0) break;
//跳过相同元素
if(i > 0 && nums[i] == nums[i-1]) continue;
//
int fix = nums[i];
int target = 0 - fix;
for(int j = i+1,k = nums.length - 1;j<k ;){
if(target > nums[j] + nums[k]){
j++;
}else if(target < nums[j] + nums[k]){
k--;
}else{
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[j]);
list.add(nums[k]);
res.add(list);
//跳过相同元素
while(j<k && nums[j] == nums[j + 1]){
j++;
}
j++;
//跳过相同元素
while(j<k && nums[k] == nums[k - 1]){
k--;
}
k--;
}
}
}
return res;
}
}
ます。https://www.jianshu.com/p/0fffd65fecb4で再現