20.11.27 leetcode454

题目链接:https://leetcode-cn.com/problems/4sum-ii/

题意:给你四个长度相同(最大为500)的无序数组,求问从每个数组中取出一个数,相加为和的方法一共有多少。

分析:我本来想的是CD数组的所有情况直接构成一个新数组e再排序,然后AB数组遍历得到的结果在e中二分查找,时间复杂度为O(N^2log(N^2)),等价于n为25000时的nlogn复杂度,感觉能过的,但还是TLE了,看题解的方法就是直接用map存,时间复杂度只有n^2,确实要先进不少。

class Solution {
public:
    int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
        int ans=0;
        unordered_map<int,int> m;
        int n=A.size();
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                ++m[A[i]+B[j]];
            }
        }
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(m.count(-C[i]-D[j])){
                    ans+=m[-C[i]-D[j]];
                }
            }
        }
        return ans;
    }
};
原文地址:https://www.cnblogs.com/qingjiuling/p/14046621.html