15. 3Sum(Array)

对数组的每一个数进行遍历,从这个数之后的数字中找出两个的sum等于这个数的相反数。找出这两个数的方法是从剩下list的两端开始查找,要是两端也就是lo+hi < sum的话lo就往前进一位。这中间也要注意的时,因为不能有重复,因此在找到一组相等的之后要判断lo跟lo+1是否一样,一样的话就要lo++,对hi也是同理。

 1 class Solution {
 2     public List<List<Integer>> threeSum(int[] nums) {
 3         List<List<Integer>> res = new ArrayList<> ();
 4         Arrays.sort(nums);
 5         for(int i = 0; i < nums.length - 2; i++) {
 6             if(i == 0 || (i > 0 && nums[i] != nums[i-1])) {
 7                 int lo = i + 1, hi = nums.length - 1, sum = 0 - nums[i];
 8                 while(lo < hi) {   //要记得循环
 9                     if(nums[lo] + nums[hi] == sum) {
10                         res.add(Arrays.asList(nums[i], nums[lo], nums[hi]));
11                         while(lo < hi && nums[lo] == nums[lo + 1]) lo++; // lo < hi要放在第一个,因为例如[0, 0, 0]时 
12                         while(lo < hi && nums[hi] == nums[hi - 1]) hi--; //最后一个会out of index bound,先判断lo < hi就没关系
13                         lo++;
14                         hi--;
15                     }else if(nums[lo] + nums[hi] < sum) {
16                         lo++;
17                     }else {
18                         hi--;
19                     }                  
20                 }    
21             }
22         }
23         return res;
24     }
25 }

猜你喜欢

转载自www.cnblogs.com/goPanama/p/9393765.html