454. 四数相加 II

给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
  • 复制代码
     1 class Solution {
     2 public:
     3     int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
     4         unordered_map<int, int> umap; //key:a+b的数值,value:a+b数值出现的次数
     5         // 遍历大A和大B数组,统计两个数组元素之和,和出现的次数,放到map中
     6         for (int a : A) {
     7             for (int b : B) {
     8                 umap[a + b]++;
     9             }
    10         }
    11         int count = 0; // 统计a+b+c+d = 0 出现的次数
    12         // 在遍历大C和大D数组,找到如果 0-(c+d) 在map中出现过的话,就把map中key对应的value也就是出现次数统计出来。
    13         for (int c : C) {
    14             for (int d : D) {
    15                 if (umap.find(0 - (c + d)) != umap.end()) {
    16                     count += umap[0 - (c + d)];
    17                 }
    18             }
    19         }
    20         return count;
    21     }
    22     int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {
    23         multimap<int, vector<pair<int, int>>> mp1;
    24         multimap<int, vector<pair<int, int>>> mp2;
    25         int res = 0;
    26         for (int i = 0; i < nums1.size(); i++)
    27         {
    28             for (int j = 0; j < nums1.size(); j++)
    29             {
    30                 int sum1 = nums1[i] + nums2[j];
    31                 int sum2 = nums3[i] + nums4[j];
    32                 vector<pair<int, int>> vec_sum1;
    33                 vector<pair<int, int>> vec_sum2;
    34                 vec_sum1.emplace_back(nums1[i], nums2[j]);
    35                 vec_sum2.emplace_back(nums3[i], nums4[j]);
    36                 mp1.insert(multimap<int, vector<pair<int, int>>>::value_type(sum1, vec_sum1));
    37                 mp2.insert(multimap<int, vector<pair<int, int>>>::value_type(sum2, vec_sum2));
    38             }
    39         }
    40         for (const auto& p : mp1)
    41         {
    42             auto nums = mp2.count(0 - p.first);
    43             auto iter = mp2.find(0 - p.first);
    44             if (iter != mp2.end())
    45             {
    46                 res = res + nums;
    47             }
    48         }
    49         return res;
    50     }
    51 };
    复制代码

     

posted @   xiazichengxi  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩