
暴力解法,会超出时间:
时间复杂度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