问题:
思路:
因为需要不重复,所以,想到了先排序,然后,固定一个数 i ,剩下了两个数,就可以用两数之和的办法来考虑了,但是要注意,指针变化的时候,要找到下一个不一样的数的指针。
代码:
class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> li = new ArrayList<List<Integer>>();
if(nums.length<=2){
return li;
}
//排序
nums = sort(nums);
int i = 0;
while(i<=nums.length-3){
int left = i+1;
int right = nums.length-1;
while(left<right){
if(nums[i]+nums[left]+nums[right]==0){
List<Integer> ls = new ArrayList();
ls.add(nums[i]);
ls.add(nums[left]);
ls.add(nums[right]);
li.add(ls);
if(nums[left+1]==nums[left]){
//找到下一个不一样的left;
while(left<right && nums[left]==nums[left+1]){
left++;
}
if(left == right){
break;
}
}
left++;
right = nums.length-1;
}else if(nums[i]+nums[left]+nums[right]>0){
//right 找到 下一个不重复的
while(left<right && nums[right]==nums[right-1]){
right--;
}
if(left == right){
break;
}
right--;
}else if(nums[i]+nums[left]+nums[right]<0){
//left找到 下一个 不重复的
while(left<right && nums[left]==nums[left+1]){
left++;
}
if(left == right){
break;
}
left++;
}
}
//i找到 下一个 不重复的
while(i<=nums.length-3 && nums[i] == nums[i+1]){
i++;
}
if(i>nums.length-3){
break;
}
i++;
}
return li;
}
public static int[] sort(int[] nums){
int left = 0;
int right = nums.length-1;
while(left<nums.length-1){
while(right >left){
if(nums[left]>nums[right]){
int temp = nums[left];
nums[left]= nums[right];
nums[right] = temp;
}
right--;
}
left++;
right = nums.length-1;
}
return nums;
}
}
效果:
内存还好,但是时间比较久