zoukankan      html  css  js  c++  java
  • [LeetCode] 3Sum

    Given an array S of n integers, are there elements a, b, c 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)

    分析:先排序,然后取出一个数后,在余下的数中找其他两个,即2sum,另外注意,由于题目中指定了unique,不能有重复,所以在b++,c--,a++时都要对重复情况做处理。

    PS;其实直接使用系统的sort就行,我这里实现了一个mergeSort,算是练手吧。。 

    PSPS: 在对mergeSort说两句,在mergeSort中,有条件判断 if(low < high), 但low>= high时,就返回了,即一个元素时就什么也不做,然后执行merge()函数,就自定向上完成了排序。。

     1 class Solution {
     2     
     3     void merge(int* array, int low, int mid, int high)
     4     {
     5         int *newArray = (int*)malloc(sizeof(int)* (high-low +1));
     6         
     7         int i = low, j = mid+1, k = 0;
     8         
     9         while(i <= mid && j <= high)
    10         {
    11             if(array[i] < array[j])
    12             {
    13                 newArray[k++] = array[i++];
    14             }
    15             else
    16                 newArray[k++] = array[j++];
    17         }
    18         
    19         while(i <= mid)
    20             newArray[k++] = array[i++];
    21             
    22         while(j<=high)
    23             newArray[k++] = array[j++];
    24             
    25         for(i = low; i<= high; i++)
    26             array[i] = newArray[i];
    27             
    28         free(newArray);
    29     }
    30     
    31     void mergeSort(int* array, int low, int high)
    32     {
    33         if(low < high)
    34         {
    35             int mid = (low + high)/2;
    36         
    37             mergeSort(array, low, mid);
    38             mergeSort(array, mid+1, high);
    39             merge(array, low, mid, high);
    40         }  
    41     }
    42     
    43 public:
    44     vector<vector<int> > threeSum(vector<int> &array) {
    45         
    46         int n = array.size();
    47         
    48         sort(array.begin(), array.end());
    49         
    50          vector<vector<int>> result;
    51         
    52         //mergeSort(array, 0, n-1);
    53         
    54         int a, b , c;
    55         
    56         for(a = 0; a < n-2; )
    57         {
    58             b = a +1;
    59             c = n-1;
    60             while(b<c)
    61             {
    62                 if(array[a] + array[b]+ array[c] == 0)
    63                 {
    64                     vector<int> temp;
    65                     temp.push_back(array[a]);
    66                     temp.push_back(array[b]);
    67                     temp.push_back(array[c]);
    68                     result.push_back(temp);
    69                     // this is very important b++ and c--
    70                     
    71                     //skip the dupliate ones
    72                     do {b++;} while(array[b] == array[b-1] && (b < n-1));
    73                     do {c--;} while(array[c] == array[c+1] && (c > a));
    74                 }
    75                 else if(array[a] + array[b]+ array[c] < 0)
    76                     b++;
    77                 else
    78                     c--;
    79             }   
    80             a++;
    81             // skip the duplicate ones
    82             while (array[a] == array[a-1] && a < n-2) a++;
    83         }
    84         
    85 
    86         
    87         return result;
    88     }
    89 };
  • 相关阅读:
    产品经理之PRD详解(非原创)
    编写代码的「八荣八耻」- 以开关上线为荣,以自信编码为耻
    安装社区版git仓库
    【干货分享】大话团队的GIT分支策略进化史
    Android IPC机制(一)开启多进程
    使用adb命令通过IP地址连接手机
    一篇文章了解Github和Git教程-AndroidStudio上传Github教程
    sublime实现markdown浏览器预览
    idea上maven使用心得(三)——用pom.xml添加jar包
    idea解决Maven jar依赖冲突(四)
  • 原文地址:https://www.cnblogs.com/diegodu/p/3794105.html
Copyright © 2011-2022 走看看