15. 三数之和 - 力扣(LeetCode)
思路:
- 双指针思想
- 先给数组排序
- 然后固定一个数、再设left、right指针,nums[left] + nums[right] = -nums[a]
- 大于的话right--,小于的话left++
- 每次处理完left、right之后需要判断去重
- i也需要判断去重
- 代码
-
public List<List<Integer>> threeSum(int[] nums) { //创建返回的数组 List<List<Integer>> list = new ArrayList<>(); //去重 Arrays.sort(nums); //求数组长度 int n = nums.length; //进入循环 for(int i = 0; i < n;){ //小优化 if(nums[i] > 0){ break; } int left = 1+i, right = n-1; int target = -nums[i]; while(left < right){ //转换为两数之和 int sum = nums[left] + nums[right]; if(sum > target){ right--; }else if(sum < target){ left++; }else{ list.add(new ArrayList<Integer>(Arrays.asList(nums[left],nums[right],nums[i]))); //缩小区间,继续寻找 left++; right--; //对left去重 while(left < right && nums[left] == nums[left-1]){ left++; } //对right去重 while(left < right && nums[right] == nums[right+1]){ right--; } } } //对nums[i]去重 i++; while(i < n && nums[i] == nums[i-1]){ i++; } } return list; }