📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
查看: 4198| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 讨论下leetcode 3sum

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
这道题我写了个这样的解法:
  1. vector<vector<int> > threeSum(vector<int> &num) {
  2.         // Start typing your C/C++ solution below
  3.         // DO NOT write int main() function
  4.         vector<vector<int> > result;
  5.          int i = 0, j = i + 1, l = num.size() - 1;
  6.          if(l<2) return result;

  7.         sort(num.begin(), num.end());
  8.         int prev1 = num[0];
  9.         int prev2 = num[1];
  10.         int prev3 = num[2];
  11.         
  12.         for(i = 0; i < num.size() - 2; i++)  
  13.         {   if(i>0&&prev1 == num[i]) continue;
  14.             int a = num[i];
  15.             prev1 = num[i];
  16.             prev2 = num[i+1];
  17.             prev3 = num[num.size()-1];
  18.             for(j = i + 1, l = num.size() - 1; j < l; )  
  19.             {   if(j>i+1&&prev2 == num[j]) {
  20.                     j++;
  21.                     continue;
  22.                 }
  23.                 if(l<num.size()-1&&prev3 == num[l]){
  24.                     l--;
  25.                     continue;
  26.                 }
  27.                
  28.                 int b = num[j];  
  29.                 int c = num[l];  
  30.                 if(a + b + c < 0)  
  31.                 {  
  32.                     j++;  
  33.                 }  
  34.                 else if(a + b + c > 0)  
  35.                 {   
  36.                     l--;  
  37.                 }  
  38.                 else  
  39.                 {  
  40.                     vector<int> v;
  41.                     v.push_back(a);
  42.                     v.push_back(b);
  43.                     v.push_back(c);
  44.                     result.push_back(v);
  45.                      prev2 = num[j];
  46.                      prev3 = num[l];
  47.                      j++;
  48.                      l--;
  49.                     continue;
  50.                 }  
  51.             }  
  52.         }  
  53.         return result;  
  54.     }
复制代码
还有更快的解法吗? 求牛牛们指点!

上一篇:bit vector 会比boolean array 节约很多内存么?
下一篇:社区发现算法总结
🔗
tiger 2013-1-9 13:32:20 | 只看该作者
全局:
本帖最后由 tiger 于 2013-1-9 13:40 编辑

不会有多少区别吧。先排序,然后对每一个位置:取左右两个点,根据其和进行移动。
遍历位置为O(n),移动左右点累积移动也是O(n),所以时间复杂度为O(n^2)
总的时间复杂度为O(nlgn) + O(n^2)=O(n^2)
ps.代码排版不好啊。。
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;

  5. class Solution {
  6. public:
  7.     vector<vector<int> > threeSum(vector<int> &num) {
  8.         // Start typing your C/C++ solution below
  9.         // DO NOT write int main() function
  10.         vector<vector<int> > res;
  11.         sort(num.begin(), num.end());
  12.         int len = num.size();
  13.         for(int i = 0; i <= len - 3; ++i)
  14.         {
  15.             while(i > 0 && i <= len - 3 && num[i] == num[i - 1])
  16.                 ++i;
  17.             if(i > len - 3)
  18.                 break;
  19.             int l = i + 1;
  20.             int h = len - 1;
  21.             while(l < h)
  22.            {
  23.                int sum = num[i] + num[l] + num[h];
  24.                if(sum == 0)
  25.               {
  26.                    vector<int> com;
  27.                    com.push_back(num[i]);
  28.                    com.push_back(num[l]);
  29.                    com.push_back(num[h]);
  30.                    res.push_back(com);
  31.                    l++;
  32.                    while(l < h && num[l] == num[l - 1])
  33.                          l++;
  34.                    h--;
  35.                    while(l < h && num[h] == num[h + 1])
  36.                          h--;
  37.               }
  38.              else if(sum < 0)
  39.             {
  40.                  l++;
  41.                 while(l < h && num[l] == num[l - 1])
  42.                     l++;
  43.              }
  44.              else
  45.            {
  46.                 h--;
  47.                 while(l < h && num[h] == num[h + 1])
  48.                 h--;
  49.            }
  50.       }
  51.             }
  52.         return res;
复制代码



回复

使用道具 举报

🔗
 楼主| lhy1987 2013-1-10 04:08:35 | 只看该作者
全局:
tiger 发表于 2013-1-9 13:32
不会有多少区别吧。先排序,然后对每一个位置:取左右两个点,根据其和进行移动。
遍历位置为O(n),移动左 ...

恩,咱俩方法好像一样的
回复

使用道具 举报

🔗
 楼主| lhy1987 2013-1-10 04:08:36 | 只看该作者
全局:
tiger 发表于 2013-1-9 13:32
不会有多少区别吧。先排序,然后对每一个位置:取左右两个点,根据其和进行移动。
遍历位置为O(n),移动左 ...

恩,咱俩方法好像一样的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表