3Sum

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.

Note:
  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

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


題意:給定一個數組,要求取出一個三元組,要求三元組之和爲零,且三元組不重複(三個數相同視爲重複)

思路:要求去重,因此先排序,而後進行三次循環用於暴力尋找。因爲不能是同一個元素重複三次,因此下一個循環的起點是上一個循環的值加一。在每一次循環時去重,因爲通過排序,因此相同的數已經排在一塊兒,那麼除了第一次出現以外,後面遇到這個數則跳過計算。最後將獲得的數字從小到大排序並添加到list中。

實現:java

public class Solution {
     public List<List<Integer>> threeSum( int[] num ) {
        List<List<Integer>> list= new LinkedList<List<Integer>>();
        Arrays. sort(num);//對num排序
        for(int i =0;i <num .length ;i ++){
           if(i >0&&num[i]==num[i-1])//去重,若是排序好的數組先後兩個數字是相等的,那麼以前確定已經計算過這個數字了,本次跳過
               continue;
           for(int j =i +1;j <num .length ;j ++){
               if(j >i +1&&num[j]==num[j-1])//去重,同上
                    continue;
               for(int k =j +1;k <num .length ;k ++){
                    if(k >j +1&&num[k]==num[k-1])//去重,同上
                         continue;
                    if(num [i ]+num [j ]+num [k ]==0){

                         int l1 =num [i ];
                    int l2 =num [j ];
                    int l3 =num [k ];
                   List<Integer> ll= new LinkedList<Integer>();
                    if(l1 <l2 ){
                              ll.add( l1);
                              ll.add( l2);
                              if(l3 <l1 )
                                   ll.add(0, l3);
                              else if (l3 >l1 &&l3<l2)
                                   ll.add(1, l3);
                              else
                                   ll.add( l3);
                        } else{
                              ll.add( l2);
                              ll.add( l1);
                              if(l3 <l2 )
                                   ll.add(0, l3);
                              else if (l3 >l2 &&l3<l1)
                                   ll.add(1, l3);
                              else
                                   ll.add( l3);
                        }
                    list.add( ll);
                   }
              }
          }
        }
        return list ;
    }
}
相關文章
相關標籤/搜索