编程语言
首页 > 编程语言> > LeetCode 454 python 优化历程

LeetCode 454 python 优化历程

作者:互联网

在这里插入图片描述

尝试解题1

使用两个列表分表保存nums1与nums2的和、nums3与num4的和
遍历这两个列表找到相加为和的个数,即为最后结果
超时 21/132

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        L_12 = []
        L_34 = []
        for num1 in nums1:
            for num2 in nums2:
                L_12.append(num1+num2)
        for num3 in nums3:
            for num4 in nums4:
                L_34.append(num3+num4)
        res = 0
        for num1 in L_12:
            for num2 in L_34:
                if num1 + num2 == 0:
                    res += 1
        return res

时间复杂度为O((2*n)**2),空间复杂度为O(4n),n为200,这样下来就会超时

尝试解题2

使用遍历+二分查找,题目中每个数组都可能会出现重复元素,因此需要用一个哈希表记录元素出现的次数
使用一个哈希表记录nums4的元素个数,遍历前三个数组,然后对nums4使用二分查找

超时: 33/132

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
	    def fun(nums1, nums2, nums3, nums4, ans):
            nums4.sort()
            n1, n2, n3, n4 = len(nums1), len(nums2), len(nums3), len(nums4)
            d = {}
            for num in nums4:
                if num not in d:
                    d[num] = 1
                else:
                    d[num] += 1
            for i in range(n1):
                for j in range(n2):
                    for k in range(n3):
                        tmp = -(nums1[i]+nums2[j]+nums3[k])
                        l = 0
                        r = n4-1
                        while l <= r:
                            mid = (l+r)//2
                            if nums4[mid] > tmp:
                                r = mid-1
                            elif nums4[mid] < tmp:
                                l = mid+1
                            else:
                                ans += d[nums4[mid]]
                                l = r+1
            return ans
        res = fun(nums1, nums2, nums3, nums4, 0)
        return res

时间复杂度为:O(n**3logn),空间复杂度为O(n)超时

尝试解题3

使用哈希表记录nums1和nums2的和的负数的个数,然后遍历nums3和nums4,直接索引它们的和。

终于通过啦!

class Solution:
    def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) -> int:
        d = {}
        for num1 in nums1:
            for num2 in nums2:
                if -(num1+num2) not in d:
                    d[-(num1+num2)] = 1
                else:
                    d[-(num1+num2)] += 1
        res = 0
        for num1 in nums3:
            for num2 in nums4:
                if num1+num2 in d:
                    res += d[num1+num2]
        return res

时间复杂度为O(n**2), 空间复杂度为O(2n)

在这里插入图片描述

标签:python,List,454,nums1,int,nums4,LeetCode,nums2,nums3
来源: https://blog.csdn.net/qq_42316533/article/details/122455230