题目这里就不贴出来了,可以去力扣中文站去找题目描述。(代码是参考网友的回答,如有侵权,请底下留言,我一定会删除)
这里是参考网友的双指针法,固定元素为最左侧的元素,明天我试一下固定元素为中间元素的解法,自己想了一下,觉得也可行。
PS:更新。
如果选择固定元素为中间元素的话,将十分难以去重,如果想要去重就会丢失结果集。
比方说:
[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
当元素从1移动到2又移动到3的时候,你是选择跳过还是计算呢,如果计算就会重复解,如果跳过,就会缺失解。
下面是我的测试结果,好吧,果然选择中间元素作为固定元素是有很多坑。
输入:
[-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
输出
[[-4,-2,6],[-4,0,4],[-2,0,2],[-4,1,3],[-4,2,2]]
预期结果
[[-4,-2,6],[-4,0,4],[-4,1,3],[-4,2,2],[-2,-2,4],[-2,0,2]]
而选择两侧元素为固定元素的时候,双指针所遍历的区间是一个递增区间,相对容易去重一些。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class lc15 {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
Arrays.sort(nums);
int len = nums.length;
int lens = len - 2;
if (nums == null || len < 3)
return res;
if (nums[0] <= 0 && nums[len - 1] >= 0) {
for (int i = 0; i < lens; i++) {
if (nums[i] > 0)
break;
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) {
res.add(Arrays.asList(nums[i], 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--;
}
}
}
}
return res;
}
public static void main(String[] args) {
}
}