> 技术文档 > 【力扣】第15题:三数之和

【力扣】第15题:三数之和


原文链接:15. 三数之和 - 力扣(LeetCode)

思路解析

指针

        (1)头尾指针对应值相加如果大于目标值(target),那么只能尾指针-1;如果小于target,那么只能头指针+1。

        (2)如何去除重复?因为已经排好序了,如果下一个要检索的值等于前一个检索的值,直接跳过。

 public List<List> threeSum(int[] nums) { /** * 双指针: * 头指针:开始指向当前元素的下一个元素 * 尾指针:开始指向最后一个元素 */ Arrays.sort(nums); int len = nums.length; List<List> ans = new ArrayList(); for (int i = 0; i  0 && nums[i] == nums[i - 1]) continue; int j = i + 1; int k = len - 1; int x = nums[i]; while(j0){  k--; }else if(result<0){  j++; }else {  ans.add(Arrays.asList(x,nums[j],nums[k]));  j++;  //继续排查当前遍历的i,还有没有别的组合  while(nums[j]==nums[j-1] && j<k){ j++;  }  k--;  while(nums[k]==nums[k+1] && j<k){ k--;  } } } } return ans; }

两个优化:

        优化1:如果最小的三个值相加都大于0,那么没有满足要求 的,直接break

        优化2:如果当前值和最大的两个值相加都小于0,那么本次遍历的i没有满足要求的,直接continue

 public List<List> threeSum(int[] nums) { Arrays.sort(nums); int len = nums.length; List<List> ans = new ArrayList(); for (int i = 0; i  0 && nums[i] == nums[i - 1]) continue; int j = i + 1; int k = len - 1; int x = nums[i]; if(x+nums[j]+nums[j+1] > 0) break;//优化1 if(x+nums[k]+nums[k-1] < 0) continue;//优化2 while(j0){  k--; }else if(result<0){  j++; }else {  ans.add(Arrays.asList(x,nums[j],nums[k]));  j++;  //继续排查当前遍历的i,还有没有别的组合  while(nums[j]==nums[j-1] && j<k){ j++;  }  k--;  while(nums[k]==nums[k+1] && j<k){ k--;  } } } } return ans; }

同样的思路,会做这一题,你就会两数之和了,两数之和也是用这个思想,更简单

1. 两数之和 - 力扣(LeetCode)

 

职业装定制