双指针
解题步骤:
1.首先判断数组长度,<3直接返回空ans。
2.对数组进行排序
3.排序后判断nums[i]是否大于零,大于零直接返回ans(排序之后,后面的数值都大于零,sum一定也大于零不满足要求)。
4.创建左右指针分别指向nums[i]的右边和数组的最后一个。
5.如果nums[i] + nums[left] + nums[right]==0,添加进ans,然后移动letf和right,使left和right不等于现在的值,因为三个数确定了nums[i]和任意的一个数,另一个也就固定了,期间考虑数组越界情况。
6.如果nums[i] + nums[left] + nums[right]>0,将right向左移动
7.如果nums[i] + nums[left] + nums[right]>0,将right向右移动
8.最后在每次重写开始循环的时候判断 nums[i] == nums[i - 1],相同则跳过
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList();
int len = nums.length;
if (len < 3) return ans;
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
if (nums[i] > 0) return ans;
if (i > 0 && nums[i] == nums[i - 1]) continue;
int left = i + 1;
int right = len - 1;
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
ans.add(Arrays.asList(nums[i], nums[left], nums[right]));
while (left < len - 1 && nums[left] == nums[++left]) ;
while (right > 0 && nums[right] == nums[--right]) ;
} else if (sum > 0) {
right--;
} else {
left++;
}
}
}
return ans;
}
}