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; } };