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)

    即给定一个数组S,输出S中的三个元素使得之和为0,且每个元组中元素从小到大的排列,且不重不漏。

    为了保证不重不漏,首先把数组S进行排序。其中数组S的大小为N。若使用三重for循环则会超时。

    方法是使用三个指针i,p,q对数组进行遍历,其中

    • i从[0,N-2)进行正向遍历,代表三元组的第一个元素。
    • p从(i,N-1)进行正向遍历,代表三元组的第二个元素。
    • q从(N,p)进行反向遍历,代表三元组中的第三个元素。

    当sum>0时,说明和过大,则q--,当sum<0时,说明和过小p++,若sum==0,则保存到结果中。

    需要注意的是,为了保证三元组不重复,要判断当前指向的元素与上一次指向的元素的值是否相同,若相同说明已经遍历过了,continue即可。

    代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<int> > threeSum(vector<int> &num) {
     4 
     5         vector<vector<int> > res;
     6 
     7         if( num.size() < 3 )
     8         {
     9             return res;
    10         }
    11 
    12         sort(num.begin(), num.end());
    13 
    14         for( int i = 0 ; i < num.size()-2 ; i++ )
    15         {
    16             if( i > 0 && num[i] == num[i-1] )
    17             {
    18                 continue;
    19             }
    20             int p = i + 1;
    21             int q = num.size() - 1;
    22             while( p < q )
    23             {
    24 
    25                 if( p > i + 1 && num[p] == num[p-1] )
    26                 {
    27                     p++;
    28                     continue;
    29                 }
    30 
    31                 if( q < num.size()-1 && num[q+1] == num[q]  )
    32                 {
    33                     q--;
    34                     continue;
    35                 }
    36 
    37                 vector<int> sumtmp;
    38 
    39                 int sum = num[i] + num[p] + num[q];
    40 
    41                 if( sum == 0 )
    42                 {
    43                    sumtmp.push_back(num[i]);
    44                    sumtmp.push_back(num[p]);
    45                    sumtmp.push_back(num[q]);
    46                    res.push_back(sumtmp);
    47                    p++;
    48                 }
    49 
    50                 if( sum < 0 )
    51                 {
    52                     p++;
    53                 }
    54 
    55                 if( sum > 0 )
    56                 {
    57                     q--;
    58                 }
    59             }
    60         }
    61     }
    62 };
  • 相关阅读:
    TCP软件环境测试
    MTK6261之检测是否插了T卡
    java实现MD5加密
    Lrucache缓存技术
    Android自定义UI模板
    《富爸爸,穷爸爸》读后感——怎么实现财务自由
    JAVA双向链表
    写一个查找算法找出数组中相同的元素
    二分查找算法(JAVA)
    Android查询系统的音频(音乐播放器的核心)
  • 原文地址:https://www.cnblogs.com/jostree/p/3689138.html
Copyright © 2011-2022 走看看