给一个数组,找到全部的三数之和等于0。不能有重复的组合。
方法一:暴力破解。
方法二:先排序。然后固定第一个数,把第一个数相反数作为目标值,第二个数和第三个数分别初始化为第一个数之后的数组的前后两端值做遍历。实际写代码时要注意细节问题。
import java.util.*;
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
Arrays.sort(nums);
int length = nums.length;
for (int i = 0; i < length - 2; i++) {
if (i > 0 && nums[i] == nums[i - 1]) { // 跳过重复的遍历值
continue;
}
int target = -nums[i];
for (int j = i + 1; j < length - 1; j++) {
if (j > i + 1 && nums[j] == nums[j - 1]) { // 跳过重复的遍历值
continue;
}
int k = length - 1;
while(j < k && nums[j] + nums[k] > target) {
k--;
}
if (j == k) {
break;
}
if (nums[j] + nums[k] == target) {
List<Integer> subRet = new ArrayList<Integer>();
subRet.add(nums[i]);
subRet.add(nums[j]);
subRet.add(nums[k]);
ret.add(subRet);
}
}
}
return ret;
}
}