原题
思路
有两个关键点
注意点一
怎么去重,我是将有序数字组合成字符串,再放入SET自动去重。
注意点二
超时,考虑双指针。
代码
代码我写了两种,第一种虽然有结果,但是执行超时,优化了一下,虽然还不是很快,但是已经比之前快了很多。
package leetcode.Algorithms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
public class Solution_15 {
public static void main(String[] args) {
int[] nums = {
-1, 0, 1, 2, -1, -4};
threeSum_update(nums);
}
public static List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0 || nums.length < 2) {
return ans;
}
//排序
Arrays.sort(nums);
HashSet<String> set1 = new HashSet<String>();
//从大到0
for (int i = nums.length - 1; i >= 0; i--) {
int target = nums[i];//目标树
//拆分为正负两部分
if (target >= 0) {
for (int j = 0; j < i; j++) {
for (int k = nums.length - 2; k > j; k--) {
if (nums[j] + nums[k] + target == 0 && i > k && k > j) {
if (set1.contains(String.valueOf(nums[i]) + String.valueOf(nums[j]) + String.valueOf(nums[k])) == false) {
ans.add(Arrays.asList(nums[j], nums[k], nums[i]));
set1.add(String.valueOf(nums[i]) + String.valueOf(nums[j]) + String.valueOf(nums[k]));
}
}
}
}
}
}
System.out.println(ans);
return ans;
}
public static List<List<Integer>> threeSum_update(int[] nums) {
List<List<Integer>> list = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0 || nums.length < 2) {
return list;
}
//排序
Arrays.sort(nums);
HashSet<String> set1 = new HashSet<String>();
//从大到0
for (int i = nums.length - 1; i >= 0; i--) {
int l = 0;
int r = i - 1;
while (l < r) {
if (nums[l] + nums[r] + nums[i] == 0) {
if (set1.contains(String.valueOf(nums[i]) + String.valueOf(nums[r]) + String.valueOf(nums[l])) == false) {
list.add(Arrays.asList(nums[i], nums[r], nums[l]));
set1.add(String.valueOf(nums[i]) + String.valueOf(nums[r]) + String.valueOf(nums[l]));
}
l++;
} else if (nums[l] + nums[r] + nums[i] > 0) {
r--;
} else if (nums[l] + nums[r] + nums[i] < 0) {
l++;
}
}
}
System.out.println(list);
return list;
}
}