題目分析
- 該題目利用雙指針加排序
- 該題目的難點在於去除重複
那麼如何去除重複呢?
- 除去重複的第一個元素i
- 對於每一個i,除去重複的l和r
Java代碼
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
Arrays.sort(nums);
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
return res;
}
int l = i+1;
int r = nums.length-1;
// 去除重複的i
if(i>0 && nums[i]==nums[i-1]){
continue;
}
while(l<r){
if(nums[i] + nums[l] + nums[r] == 0){
List<Integer> list = new ArrayList<>();
list.add(nums[i]);
list.add(nums[l]);
list.add(nums[r]);
res.add(new ArrayList<>(list));
// 去除重複的l和r
while(l<r && nums[l]==nums[l+1]){
l++;
}
while(l<r && nums[r]==nums[r-1]){
r--;
}
// 調整l和r,遍歷所有i產生的三元組
l++;
r--;
}else if(nums[i] + nums[l] + nums[r] < 0){
l++;
}else{
r--;
}
}
}
return res;
}