leetcode hot100 238.除了自身以外数组的乘积 medium

暴力解法,会超出时间:

时间复杂度O(n²)

python 复制代码
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        if not nums:
            return []

        res = [1] * len(nums)  # 初始化 res 数组,所有值为 1

        for i in range(len(nums)):
            plus = nums[:]
            plus[i] = 1
            for p in plus:
                res[i] *= p

        return res
python 复制代码
plus = nums[:]    # 使用切片操作创建 nums 的副本
plus = nums 	  # 引用传递,意味着 plus 变量只是对 nums 的引用(它们指向同一个内存位置),当修改 plus[i] 时,实际上是在修改 nums[i],因为 plus 和 nums 共享相同的内存空间。

和接雨水有点像

先算左边的乘积,

再算右边的乘积

暴力:

left 和 right 都是 时间复杂度O(n²)

res 数组的时间复杂度是 O(n)

O(n²)+O(n²)+O(n)=O(n²)

空间复杂度是 O(n)

使用了三个数组 left、right 和 res,它们的大小都为 n

python 复制代码
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        if not nums:
            return []

        n = len(nums)

        left = [1] * n
        for i in range(n):
            for j in range(0,i):
                left[i] *= nums[j]


        right = [1] * n
        for i in range(n):
            for j in range(i+1,n):
                right[i] *= nums[j]
        
        res =  [1] * n
        for i in range(n):
            res[i] =  left[i] * right[i]

        return res

可以通过 前缀乘积 和 后缀乘积 的方法将时间复杂度从 O(n²) 优化到 O(n)

python 复制代码
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        if not nums:
            return []

        n = len(nums)

        res = [1]*n

        #  计算前缀乘积
        left = 1
        for i in range(n):
            res[i] = left       # 前缀乘积
            left *= nums[i]   # 更新前缀乘积

        right = 1
        for i in range(n-1, -1 ,-1):
            res[i] *= right       # 后缀乘积
            right *= nums[i]   # 更新后缀乘积

        return res

或者

python 复制代码
class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        if not nums:
            return []

        n = len(nums)

        #  计算前缀乘积
        left = [1]*n
        for i in range(1,n):
           left[i] = left[i - 1] * nums[i - 1]

        right = [1] * n  # 初始化 right 数组
        for i in range(n - 2, -1, -1):  # 从倒数第二个元素开始
            right[i] = right[i + 1] * nums[i + 1]

        # Step 3: 计算结果数组 res
        res = [1] * n
        for i in range(n):
            res[i] = left[i] * right[i]

        return res
相关推荐
海天一色y2 小时前
python---力扣数学部分
算法·leetcode·职场和发展
踩坑记录2 小时前
leetcode hot100 56.合并区间 medium
leetcode
源代码•宸2 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
程序员-King.2 小时前
day132—链表—K个一组翻转链表(LeetCode-25)
leetcode·链表·贪心算法
鱼跃鹰飞3 小时前
Leetcode尊享面试100题:1060. 有序数组中的缺失元素
算法·leetcode·面试
sprintzer4 小时前
1.6-1.15力扣数学刷题
算法·leetcode·职场和发展
踩坑记录4 小时前
leetcode hot100 53.最大子数组和 动态规划 medium
leetcode·动态规划
老鼠只爱大米5 小时前
LeetCode算法题详解 56:合并区间
leetcode·并查集·合并区间·区间合并·线性扫描·算法面试
鱼跃鹰飞6 小时前
Leetcode尊享面试100题:252. 会议室
算法·leetcode·面试