先看题目:
这个和之前做的第16题思想是一致的,先找到一个固定的nums[i], 然后不断变化left和right,然后去找到满足和为0的要求:
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
if (nums.length < 3) {
return new ArrayList<>();
}
List<List<Integer>> result = new ArrayList<>();
int sum = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length; i++) {
int left = i + 1;
int right = nums.length - 1;
while (left < right) {
sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
List<Integer> temp = new ArrayList<>();
temp.add(nums[i]);
temp.add(nums[left]);
temp.add(nums[right]);
if(!result.contains(temp)) {
result.add(temp);
}
}
if (sum < 0) {
left++;
} else {
right--;
}
}
}
return result;
}
这里简单说一下遇到的两个坑吧:
第一:使用这种差分的思想,一定要先排序:
Arrays.sort(nums);
不然左右移动数据没有意义。
第二:去除重复项:
当输入为[0, 0, 0, 0]时候,要直接去重
if(!result.contains(temp)) {
result.add(temp);
}
好了,今天就到这里,有问题欢迎留言讨论交流~