ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

LeetCode 454 python 优化历程

2022-01-12 15:58:37  阅读:147  来源: 互联网

标签:python List 454 nums1 int nums4 LeetCode nums2 nums3


在这里插入图片描述

尝试解题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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有