[题目链接](剑指 Offer II 007. 数组中和为 0 的三个数 - 力扣(LeetCode) (leetcode-cn.com))
思路
- 和第六题思路很接近,第六题是有序数组,这里数组是无序的,并且需要输出不重复的三元组。
- 先给目标数组排序,选定第一个数,在剩下的数里面进行双指针查询,判断三个数之和是否为0。由于已经排好序了,判断下一个字符是否和当前选定的字符相同,若相同,下标继续后移,直到不相同为止。
代码
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> re = new ArrayList<List<Integer>>();
Arrays.sort(nums);//先对数组进行排序
for(int i = 0; i < nums.length;i++) {
//按照顺序固定第一个数
int left = i+1;
int right = nums.length-1;
for( ;left < right ;){//在剩下的数中进行双指针查询判断
int lr = nums[left] + nums[right];
//System.out.println("lr = " + lr +" nums[i] = " + nums[i]);
if(lr + nums[i] == 0) {//如果三数之和为0
List<Integer> l = new ArrayList<>();//创建一个临时列表将这个三个数放进去
l.add(nums[i]);
l.add(nums[left]);
l.add(nums[right]);
//System.out.println(l);
re.add(l);//再将这个列表添加进返回的列表中
int ll = left + 1;
while(ll < nums.length && nums[ll] == nums[left]){ //去重
//防止数组下标越界, 把ll < nums.length 放前面判断
ll++;
}
left = ll;
} else if(lr + nums[i] < 0) {
left++;
} else {
right--;
}
while((i+1)< nums.length && nums[i] == nums[i+1]) i++;//去重
}
}
return re;
}
}