题目链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
算法思想:
使用双指针的思想,首先需要先对数组进行排序,让数组满足单调性,这样在相加的时候更加方便更新条件;再遍历数组,遍历数组的目的就是确定一个数nums[i],然后在剩下的数中找到两个数时其相加等于-nums[i],这样三个数相加的结果就是0了
注意:
结果要求返回的三元组不能是重复的,所以每找到一组三元组的时候,更新left和right两个指针的时候也需要进行去重(就是多加一个条件,判断更新指针之后的数如果和更新之前的数一样的话就继续更新指针),同时去重的时候也要注意越界问题
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ret = new ArrayList<>();
//1.先对数组排序
Arrays.sort(nums);
//2.使用双指针解决
//2.1先固定第一个数
int n = nums.length;
for(int i = 0;i < n;) {
//对后面的数组利用双指针的思想
int target = -nums[i];
int left = i+1;
int right = n-1;
while(left < right) {
int sum = nums[left] + nums[right];
if(sum < target) {
left++;
} else if(sum > target) {
right--;
} else {
//此时的三元组是:nums[i] nums[left] nums[right]
ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
left++;
right--;
//需要去重 去重的时候要防止数组下标越界
while(left < right && nums[left] == nums[left-1]) {
left++;
}
while(left < right && nums[right] == nums[right+1]) {
right--;
}
}
}
//外面固定的数nums[i]也需要进行去重
i++;
while(i < n && nums[i] == nums[i-1]) {
i++;
}
}
return ret;
}