第454题.四数相加II

力扣题目链接

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

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

 分析:

当需要判断一个元素是否在集合中时,就使用哈希法

set map multiset multimap 底层为红黑树,unordered_set unordered_map底层是哈希

unordered_set会去重,故使用unordered_map。

如果首先遍历一个数组,然后遍历三个数组来进行判断,时间复杂度n*n^3;

如果遍历两个数组,然后遍历两个数组进行判断,时间复杂度n^2*n^2,为最优解。

 map中的key对应a+b数组的和,value对应和出现的次数。

int fourSumCount(vector& A, vector& B, vector& C, vector& D) {
	unordered_map umap; //key:a+b的数值,value:a+b数值出现的次数
	for (int a:A) {
		for (int b:B) {
			umap[a+b]++;
		}
	}
	int count = 0;//统计总次数   a+b+c+d=0 c+d=0-(a+b)
	for (int c:C) {
		for (int d:D) {
			if (umap.find(0-(c+d))!=umap.end()) {
				count += umap[0 - (c + d)];//每出现一次 就和a+b数组中出现的次数相加
			}
		}
	}
	return count;
}

你可能感兴趣的:(算法,算法,数据结构)