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
相关推荐
文丑颜不良啊42 分钟前
LeetCode1581~1600题目解析
java·leetcode
文丑颜不良啊4 小时前
LeetCode1541~1560题目解析
java·leetcode
文丑颜不良啊14 小时前
LeetCode1481~1500题目解析
java·leetcode
文丑颜不良啊15 小时前
LeetCode1381~1400题目解析
java·leetcode
Tisfy18 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
A boy CDEF girl19 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
驭渊的小故事1 天前
LeetCode 算法题解:滑动窗口与数组合并的实战应用
算法·leetcode·职场和发展
文丑颜不良啊1 天前
LeetCode1501~1520题目解析
java·leetcode
Navigator_Z1 天前
LeetCode //C - 1311. Get Watched Videos by Your Friends
c语言·算法·leetcode
Pniubi1 天前
力扣42接雨水(动态规划法)
算法·leetcode·职场和发展