leetcode-master/problems/0454.四数相加II.md

2.5 KiB
Raw Blame History

题目地址

https://leetcode-cn.com/problems/4sum-ii/

思路

本题咋眼一看好像和第18题. 四数之和第15题.三数之和差不多,其实差很多。

本题是使用哈希法的经典题目,而第18题. 四数之和第15题.三数之和 并不合适使用哈希法,因为使用哈希的方法在不超时的情况下做到对结果去重很困难。

而这道题目相当于说不用考虑重复元素是四个独立的数组所以相对于题目18. 四数之和题目15.三数之和,还是简单了不少!

解题步骤:

  1. 首先定义 一个unordered_mapkey放a和b两数之和value 放a和b两数之和出现的次数。
  2. 遍历大A和大B数组统计两个数组元素之和和出现的次数放到map中。
  3. 定义int变量count用来统计a+b+c+d = 0 出现的次数。
  4. 在遍历大C和大D数组找到如果 0-(c+d) 在map中出现过的话就用count把map中key对应的value也就是出现次数统计出来。
  5. 最后返回我们的统计值 count 就可以了

C++代码

class Solution {
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        unordered_map<int, int> umap; //key:a+b的数值value:a+b数值出现的次数
        // 遍历大A和大B数组统计两个数组元素之和和出现的次数放到map中 
        for (int a : A) {
            for (int b : B) {
                umap[a + b]++;
            }
        }
        int count = 0; // 统计a+b+c+d = 0 出现的次数
        // 在遍历大C和大D数组找到如果 0-(c+d) 在map中出现过的话就把map中key对应的value也就是出现次数统计出来。
        for (int c : C) {
            for (int d : D) {
                if (umap.find(0 - (c + d)) != umap.end()) {
                    count += umap[0 - (c + d)];
                }
            }
        }
        return count;
    }
};

更多算法干货文章持续更新可以微信搜索「代码随想录」第一时间围观关注后回复「Java」「C++」 「python」「简历模板」「数据结构与算法」等等就可以获得我多年整理的学习资料。