• [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 混淆代码 -- 报错:can't find referenced class
    adb shell 删除删除指定文件夹和文件
    php GD库
    javascript的继承实现
    Mysql
    如何使用canvas画星星
    基于形态编程设计类
    算法
    腾讯web前端一面
    如何去克服害怕
  • 原文地址:https://www.cnblogs.com/Azurewing/p/4308660.html
Copyright © 2020-2023  润新知