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
相关推荐
旖旎夜光7 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
CoderYanger10 小时前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
圣保罗的大教堂10 小时前
leetcode 3524. 求出数组的 X 值 I 中等
leetcode
Tim_1011 小时前
【LeetCode】338、比特位计数
c++·算法·leetcode
mmmmath_312 小时前
LeetCode.028.找出字符串中第一个匹配项的
数据结构·算法·leetcode
Navigator_Z13 小时前
LeetCode //C - 1255. Maximum Score Words Formed by Letters
c语言·算法·leetcode
All for pursuit.13 小时前
【栈-4】739.每日温度
数据结构·c++·算法·leetcode
开开心心就好13 小时前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
All for pursuit.13 小时前
【栈-5】84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
圣保罗的大教堂14 小时前
leetcode 1665. 完成所有任务的最少初始能量 中等
leetcode