給定一個包含 n 個整數的數組 nums
,判斷 nums
中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
例如, 給定數組 nums = [-1, 0, 1, 2, -1, -4], 滿足要求的三元組集合爲: [ [-1, 0, 1], [-1, -1, 2] ]
其實和題目16類似稍做修改即可,時間複雜度O(n^2)
主要變動爲
不可重複要處理,
相近改爲相同要處理
class Solution {
public List<List<Integer>> threeSum(int[] nums)
{
Arrays.sort(nums);//java自帶快排
List<List<Integer>> result = new LinkedList<>();
int target=0;
int sum;
for(int i=0;i<=nums.length-3;i++)//減3因爲最後三個數
{
if(i==0||(i>0&&nums[i]!=nums[i-1]))//我用這個麻煩的方法是因爲我暫時不知道如何和list裏面的數組是否equal,只能在進去分析前把相同的數剃掉
{
int start=i+1;//第二個數的指針從i後一位開始
int end=nums.length-1;//第三個數的指針從最後一位開始
while(start<end)
{
if(start==i+1||(start>i+1&&nums[start]!=nums[start-1]))
{
if(end==nums.length-1||(end<nums.length-1&&nums[end]!=nums[end+1]))
{
sum=nums[i]+nums[start]+nums[end];
//如果sum比target小,那麼讓sum大一點,即start加1
if(sum<target)
{
start=start+1;
}
//如果sum比target小,那麼讓sum大一點,即start加1
else if(sum>target)
{
end=end-1;
}
//一樣可以直接輸出,因爲題目假定唯一最近
else
{
result.add(new LinkedList<>(Arrays.asList(nums[i],nums[start],nums[end])));
start+=1;
}
}
else {end=end-1;}
}
else {start=start+1;}
}
}
}
return result;
}
}