小明思考

          Just a software engineer
          posts - 124, comments - 36, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          三個數之和

          Posted on 2013-05-01 23:13 小明 閱讀(1928) 評論(0)  編輯  收藏 所屬分類: 數據結構和算法
          問題給定一個由n個整數組成的數組S,是否存在S中的三個數a,b,c使得 a+b+c=0?找出所有的不重復的和為0的三元組。

          注意:
          1.三元組的整數按照升序排列 a<b<c
          2.給出的結果中不能含有相同的三元組


          分析:
          如果窮舉所有這樣的三元組,需要三重循環,算法的復雜度肯定是O(n3)。
          能不能把算法復雜度降到O(n2)呢?答案是可以的。
          首先我們要把數組排序(O(nlgn)),然后固定a,在剩余的數組中看能不能找到a+b+c=0
          因為數組是排序的,我們把b指向第一個元素,c指向末尾。
          三種情況:
          a+b+c=0:找到一組解
          a+b+c<0: b向后移一位,增大和
          a+b+c>0: c向前移一位,減小和

          還要注意的是去掉重復的解,保證a和b都和上次的不同即可。

          代碼如下:

          public class Solution {
              public ArrayList<ArrayList<Integer>> threeSum(int[] num) {
                  ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
                  if(num!=null && num.length>=3){
                      Arrays.sort(num);
                      int len = num.length;
                      int lasta=0;
                  
                      for(int i=0;i<len-2;++i){
                          int a = num[i];
                          if(i>0 && a==lasta){
                              continue;
                          }
                          lasta = a;
                          int s = i+1;
                          int p = len-1;
                          int lastb = 0, j=0;
                          while(s<p){
                              int b = num[s];
                              int c = num[p];
                              int t = a+b+c;
                              if(t==0){
                                  ++s;
                                  --p;
                                  if(j>0 && b==lastb){
                                      continue;
                                  }
                                  ++j;
                                  lastb = b;
                                  ArrayList<Integer> tripplet = new ArrayList<Integer>();
                                  tripplet.add(a);
                                  tripplet.add(b);
                                  tripplet.add(c);                        
                                  result.add(tripplet);
                              }
                              else if(t>0){
                                  --p;
                              }
                              else{
                                  ++s;
                              }
                          }
                      }
                  }
                  return result;
              }
          }
          主站蜘蛛池模板: 舟山市| 无棣县| 韩城市| 公主岭市| 刚察县| 长寿区| 莫力| 清河县| 明光市| 渭源县| 新巴尔虎左旗| 宜君县| 甘南县| 江津市| 博罗县| 南宁市| 阳朔县| 晋江市| 翁牛特旗| 绩溪县| 玉树县| 安福县| 温宿县| 桂平市| 迭部县| 文登市| 清水河县| 库车县| 金坛市| 岑溪市| 永新县| 湟中县| 襄垣县| 吉林省| 崇阳县| 水城县| 江达县| 文山县| 湟源县| 额敏县| 阳城县|