Leetcode 第15题.
题目,如图所示.
本题采用排序加双指针的解法.
-
为什么要进行排序呢?
本题的难点其实在于去除重复解,而排序的作用就是让我们更加容易的去除重复解,而且可以使我们走的每一步都更加接近目标值0,因为我们可以做出判断
流程:
- 排序
- 先给一个指针index,指向排序后的第0个元素,再给两个指针left和right,分别指向index的后一个元素和数组最后一个元素,三个指针所指的数加起来和0比较,如果小于,left++,大于right–,符合条件则加入集合,直至left和right相遇
- index向后移,重复2步骤,index如果指向的数比0大就可以停止了,因为后面的数都比0大,和是一定比0大的
下面附上代码:
public static List<List<Integer>> threeSum2(int[] nums) {
//排序加双链表
List<List<Integer>> list=new ArrayList<>();
if(nums==null||nums.length<3) return list;
Arrays.sort(nums);
int length=nums.length;
int index=0;
//对index的循环
while(index<length-1&&nums[index]<=0){
if(index>0&&nums[index]==nums[index-1]){ //去重
index++;continue;
}
int left=index+1,right=length-1;
//对左右双指针的循环
while(left<right){
int sum=nums[index]+nums[left]+nums[right];
if(sum==0){
list.add(Arrays.asList(nums[index],nums[left],nums[right]));
while(left<right&&nums[left]==nums[left+1]) { //去重
left++;
}
while(left<right&&nums[right]==nums[right-1]) { //去重
right--;
}
left++;right--;
}else if(sum<0)
left++;
else
right--;
}
index++;
}
return list;
}