题目Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

额外的要求是不能返回重复的triplets,返回的a,b,c的顺序要是非递减的。

解法一:首先想一下,三个数相加,要为0的话,如果不是都为0,那么至少有一个正数一个负数。可以从这一点出发,设置两个指针i和j,分别指向数组S的首尾,always保持numbers[i] <= 0 and numbers[j]>0。哦,对了,数组要先给它排序。然后判断numbers[i] + numbers[j]的符号,如果是大于0,我们就去数组负数部分search,反之去正数部分找。因为数组是sorted,search部分可以用binarySearch。代码如下:

 1 //Program Runtime: 784 milli secs
 2     public static ArrayList<ArrayList<Integer>> threeSum(int[] num) {
 3         // Start typing your Java solution below
 4         // DO NOT write main() function
 5         Arrays.sort(num);
 6         int i = 0;
 7         int j = num.length - 1;
 8         int firstNonNegativeIndex = -1;
 9         ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
10         if(j < 0 || num[i] > 0 || num[j] < 0) return result;//1.边界条件判断,如果没有非负数或者都是正数,返回空集合
11         for(int k = 0; k < num.length;k++){
12             if(num[k] >= 0){
13                 firstNonNegativeIndex = k;
14                 break;
15             }
16         }
17         for(i = 0;i <= firstNonNegativeIndex;i++){
18             if(i > 0 && num[i] == num[i-1])continue;
19             for(j = num.length - 1; j> i + 1;j--) {
20                 if(j <= num.length - 2 && num[j + 1] == num[j]) continue;
21                 int twoSum = num[i] + num[j];
22                 if(twoSum > 0) {
23                     int searchIdx = binarySearch(num, i+1,firstNonNegativeIndex - 1, -twoSum);
24                     if(searchIdx != -1){
25                         addTuple(result,new int[]{num[i],num[searchIdx],num[j]});
26                     }
27                 }else{
28                     int searchIdx = binarySearch(num, firstNonNegativeIndex,j-1, -twoSum);
29                     if(searchIdx != -1){
30                         addTuple(result,new int[]{num[i],num[searchIdx],num[j]});
31                     }
32                 }
33             }
34         }
35         return result;
36     }
O(n^2logn)

相关文章:

  • 2021-10-06
  • 2021-09-07
  • 2021-12-02
  • 2021-06-17
  • 2021-09-25
  • 2021-05-19
  • 2021-08-11
猜你喜欢
  • 2022-01-21
  • 2022-12-23
  • 2022-12-23
  • 2021-08-22
  • 2022-12-23
  • 2021-06-16
  • 2021-09-24
相关资源
相似解决方案