LeetCode15:三数之和(数组-双指针)
1、给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
方法一:暴力:
时间复杂度:O(N^3)
三个for循环
方法二:双指针:
时间复杂度:O(N^2)
/**
* 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0
* 找出所有满足条件且不重复的三元组。
* 双指针
* @param nums
* @return
*/
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> ret = new ArrayList<List<Integer>>();
if(nums.length <3){
return ret;
}
//对数组进行排序
Arrays.sort(nums);
for(int i =0;i<nums.length;i++){
if(nums[i]>0){
// 如果当前数字大于0,则三数之和一定大于0,提前结束循环
break;
}
if(i>0 && nums[i] == nums[i-1]){
//该数字重复,会导致结果重复,跳过
continue;
}
int l =i+1;
int r =nums.length-1;
while (l<r){
int sum =nums[i]+nums[l]+nums[r];
if( sum == 0){
List<Integer> list = new ArrayList<Integer>();
list.add(nums[i]);
list.add(nums[l]);
list.add(nums[r]);
ret.add(list);
//判断l的后面一个数字和r的前面一个数字是否存在与其重复
while (l<r && nums[l] == nums[l+1]){l++;}
while (l<r && nums[r] == nums[r-1]){r--;}
l++;
r--;
}else if(sum <0){
l++;
}else{
//sum >0
r--;
}
}
}
return ret;
}