1、题目描述
给出一个整数数组,找出所有和为0的三个数。注意不能有重复的。
2、思路
首先将无序数组进行升序排序,使之变成非递减数组,每次固定一个数,在后面的数组中找出另外两个数之和为该数的相反数即可(即将3sum问题转化为2sum问题,用两个指针进行求解)。
3、代码实现
class Solution {
List<List<Integer>> list = new ArrayList<List<Integer>>();
public List<List<Integer>> threeSum(int[] nums) {
Arrays.sort(nums);
if(nums.length == 0){
return list;
}
for(int i=0;i<nums.length;i++) {
if(i>0 && nums[i]==nums[i-1]){
continue;
}
int a = nums[i];
int target = 0-a;
twoSum(nums,i+1,nums.length-1,target);
}
return list;
}
public void twoSum(int [] nums,int begin,int end,int target){
while(begin < end) {
if(nums[begin]+nums[end] > target) {
end--;
}else if(nums[begin]+nums[end] < target) {
begin++;
}else {
List<Integer> arr = new ArrayList<Integer>();
arr.add(-target);
arr.add(nums[begin]);
arr.add(nums[end]);
list.add(arr);
while(begin<end && nums[begin]==nums[begin+1]) {
begin++;
}
begin++;
while(begin<end && nums[end]==nums[end-1]) {
end--;
}
end--;
}
}
}
}