题源:
15.三数之和
这题一开始没做出来,首先用两数之和的暴力循环肯定是做不出来的,后来还是看的题解才总结出来思路。
下面以nums = [-1,0,1,2,-1,-4]为例说一下我的思路并附上代码详解
package com.algorithm.array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @program: Java IDEA Projects
* @create: 2022-01-22 19:51
**/
//LeetCode15:三数之和
public class ThreeSum {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> list=new ArrayList<>();
int len=nums.length;
//不满足条件直接返回
if(nums==null || len<3) return list;
//先对数组进行排序
Arrays.sort(nums);
//遍历数组中找负数
for(int i=0;i<len;i++) {
//不是负数直接跳出循环,因为三个数一定是正数不可能为0
if(nums[i]>0) break;
//如果前后两个数相等继续下一次循环
if(i>0 && nums[i]==nums[i-1]) continue;
//定义左指针和右指针
int left=i+1;
int right=len-1;
while(left<right) {
//三个数相加的值
int tempSum=nums[i]+nums[left]+nums[right];
//如果为0,就添加到list中
if(tempSum==0) {
list.add(Arrays.asList(new Integer[]{nums[i], nums[left], nums[right]}));
//排除相等的对象
while (left < right && nums[left] == nums[left + 1]) left++;
while (left < right && nums[right] == nums[right - 1]) right--;
//继续寻找下一个相等的条件
//left++tempSum大于0
//right++tempSum小于0
left++;
right--;
}else if(tempSum>0) {
//大小0需要将right左移
right--;
}else {
//小于0需要将left右移
left++;
}
}
}
return list;
}
}