四数相加 ||

61 阅读1分钟

题目链接:leetcode.cn/problems/4s…

题解


func fourSumCount(nums1 []int, nums2 []int, nums3 []int, nums4 []int) int {
	var record = make(map[int]int, len(nums1)*len(nums1))

	for _, n1 := range nums1 {
		for _, n2 := range nums2 {
			record[n1+n2]++
		}
	}

	var result int
	for _, n3 := range nums3 {
		for _, n4 := range nums4 {
			result += record[-n3-n4]
		}
	}

	return result
}

要点

  • 先考虑暴力解法:四层 for 循环计算每一组结果并且判断和是否为 0。这样的时间复杂度是 O(n^4)。

  • 所以可以分为两组分别计算,然后判断两组的和是否为 0。这样就可以把时间复杂度降为 O(n^2)。

  • 🌝 发现个有意思的事情,代码第 3 行:初始化保存临时结果的 map 时,如果手动指定 map 的容量或者不指定容量时,ac 后的耗时是 100+ms;但是如果使用 len(nums1)*len(nums1) 初始化时,耗时就会降为 50+ms。