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

    算法渣,现实基本都参考或者完全拷贝[戴方勤(soulmachine@gmail.com)]大神的leetcode题解,此处仅作刷题记录。

     

     1 class Solution {
     2 public:
     3     vector<vector<int>  >  fourSum(vector<int>  &num, int  target)  {
     4         vector<vector<int> > result;
     5         if (num.size() < 4)
     6             return result;
     7         sort(num.begin(), num.end());
     8         
     9         unordered_map<int, vector<pair<int, int> > > cache;
    10         for (size_t a = 0; a < num.size(); a++){
    11             for (size_t b = a + 1; b < num.size(); b++) {
    12                 cache[num[a] + num[b]].push_back(pair<int, int>(a, b)); // 对于某个和,可能存在多种组合,这些组合存储到一个向量中
    13             }
    14         }
    15 
    16         for (size_t c = 0; c < num.size(); c++) {
    17             for (size_t d = c + 1; d < num.size(); d++) {
    18                 const int key = target - num[c] - num[d];
    19                 if (cache.find(key) == cache.end())
    20                     continue;
    21 
    22                 const auto& vec = cache[key];
    23                 for (size_t k = 0; k < vec.size(); ++k) {
    24                     if (c <= vec[k].second) // 重复
    25                         continue;
    26                     result.push_back({ num[vec[k].first], num[vec[k].second], num[c], num[d] });
    27                 }
    28             }
    29         }
    30 
    31         sort(result.begin(), result.end());
    32         result.erase(unique(result.begin(), result.end()), result.end());
    33         return result;
    34     }
    35 };

    下面方法感觉更好

     1 class  Solution  {
     2 public:
     3     vector<vector<int>>  fourSum(vector<int>&  num, int  target)  {
     4         vector<vector<int>>  result;
     5         if (num.size()  <  4)  return  result;
     6         sort(num.begin(), num.end());
     7         unordered_multimap<int, pair<int, int>>  cache;
     8         for (int i = 0; i + 1 < num.size(); ++i)
     9         for (int j = i + 1; j < num.size(); ++j)
    10             cache.insert(make_pair(num[i] + num[j], make_pair(i, j)));
    11         for (auto i = cache.begin(); i != cache.end(); ++i)  {
    12             int  x = target - i->first;
    13             auto  range = cache.equal_range(x);
    14             for (auto j = range.first; j != range.second; ++j)  {
    15                 auto  a = i->second.first;
    16                 auto  b = i->second.second;
    17                 auto  c = j->second.first;
    18                 auto  d = j->second.second;
    19                 if (a != c  &&  a != d  &&  b != c  &&  b != d)  {
    20                     vector<int>  vec = { num[a], num[b], num[c], num[d] };
    21                     sort(vec.begin(), vec.end());
    22                     result.push_back(vec);
    23                 }
    24             }
    25         }
    26         sort(result.begin(), result.end());
    27         result.erase(unique(result.begin(), result.end()), result.end());
    28         return  result;
    29     }
    30 };

    杂记:

    1. pair

    This class couples together a pair of values, which may be of different types (T1 and T2). The individual values can be accessed through its public members first and second.

    Pairs are a particular case of tuple.

    2. 其他方法用到的类 unordered_multimap

    Unordered multimaps are associative containers that store elements formed by the combination of a key value and amapped value, much like unordered_map containers, but allowing different elements to have equivalent keys.

    Elements with equivalent keys are grouped together in the same bucket and in such a way that an iterator (seeequal_range) can iterate through all of them.

    3. insert

    unordered_multimap没有[]运算符,必须以insert方式插入数据,而且插入式必须调用make_pair函数

    4. equal_range

    Get subrange of equal elements

    Returns the bounds of the subrange that includes all the elements of the range [first,last) with values equivalent tova

  • 相关阅读:
    创业失败的七个原因及解决之道
    技术人员如何参与产品设计讨论:激活那一潭死水
    基于Android Studio搭建hello world工程
    WINCE6.0+IMX515通过cfimager.exe烧录镜像文件
    基于Android Studio搭建Android应用开发环境
    WinCE启动失败的原因与解决办法分析
    Maximum Allowed Error 7 错误解决
    s3c6410 开发板Linux系统支持 K9GAG08U0E的方法
    Nandflash 驱动移植
    GIFT-EMS礼记----青软S2SH(笔记)
  • 原文地址:https://www.cnblogs.com/Azurewing/p/4308660.html
Copyright © 2011-2022 走看看