文章目录
Leetcode 454: 四数相加Ⅱ (python)
注:本人文章中内容中来自于各大佬的经验总结,仅供自身复习及学习,并无商业用途,若有时忘记标注作者及出处还请提醒,敬请见谅。
我的思路
额,本小菜鸡最直接的思路是采用最简单的四层for循环,但是尝试后发现,这种方法在输入数组较大时会超出时间限制。
于是我尝试将四个数组分成两组,采用一个字典记录前两个数组中每一种数值组合出现的次数,如{1:3, 2:4},这个字典说明前两个数组中,使得两数之和为1的组合有3种,使得两数之和为2的组合有4种。
然后再对后两个数组的数值和进行判断,看其和的负数是否存在于之前创建的字典的键中,若存在,则说明这种情况能够使得四个数的和为0,且这种情况的个数为字典中对应键的个数,如:在前面假设的情况下,第三个和第四个数组中有一对数之和为-2,那么这时使得四个数之和为0的组合共有4种。最后将字典中所有符合情况的键对应的值相加,即得最后结果。
我的leetcode代码如下:
class Solution:
def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
n = len(nums1)
res = 0
dic = {}
for i in range(n):
for j in range(n):
if nums1[i] + nums2[j] in dic.keys():
dic[nums1[i] + nums2[j]] += 1
else:
dic[nums1[i] + nums2[j]] = 1
for i in range(n):
for j in range(n):
if -(nums3[i] + nums4[j]) in dic.keys():
res += dic[-(nums3[i] + nums4[j])]
return res
leetcode官方题解
后面我查看题解时,觉得官方代码比我的好看多了,特此记录学习一下:
leetcode官方题解代码:
class Solution:
def fourSumCount(self, A: List[int], B: List[int], C: List[int], D: List[int]) -> int:
countAB = collections.Counter(u + v for u in A for v in B)
ans = 0
for u in C:
for v in D:
if -u - v in countAB:
ans += countAB[-u - v]
return ans
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/4sum-ii/solution/si-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。