每日leetcode-数组-238. 除自身以外数组的乘积
分类:数组-前缀和数组
题目描述:
给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
解题思路1:
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: length = len(nums) # L 和 R 分别表示左右两侧的乘积列表 L, R = [0] * length, [0] * length answer = [0] * length # 计算左侧的乘积 # L[i] 为索引 i 左侧所有元素的乘积 # 对于索引为 '0' 的元素,因为左侧没有元素,所以 L[0] = 1 L[0] = 1 for i in range(1,length): L[i] = L[i-1] * nums[i-1] # 计算右侧的乘积 # R[i] 为索引 i 右侧所有元素的乘积 # 对于索引为 'length-1' 的元素,因为右侧没有元素,所以 R[length-1] = 1 R[length-1] = 1 for i in reversed(range(length-1)): R[i] = nums[i+1] * R[i+1] # 对于索引 i,除 nums[i] 之外其余各元素的乘积就是左侧所有元素的乘积乘以右侧所有元素的乘积 for i in range(length): answer[i] = L[i]*R[i] return answer
时间复杂度:O(N),其中 N指的是数组 nums 的大小。预处理 L 和 R 数组以及最后的遍历计算都是 O(N)的时间复杂度。
空间复杂度:O(N),其中 N指的是数组 nums 的大小。使用了 L 和 R 数组去构造答案,L 和 R 数组的长度为数组 nums 的大小。
解题思路2:
class Solution: def productExceptSelf(self, nums: List[int]) -> List[int]: length = len(nums) answer = [0] * length # 计算左侧的乘积 # answer[i] 表示索引 i 左侧所有元素的乘积 # 因为索引为 '0' 的元素左侧没有元素, 所以 answer[0] = 1 answer[0] = 1 for i in range(1,length): answer[i] = answer[i-1] * nums[i-1] # 计算右侧的乘积 # R 为右侧所有元素的乘积 # 刚开始右边没有元素,所以 R = 1 R = 1 for i in reversed(range(length)): # 对于索引 i,左边的乘积为 answer[i],右边的乘积为 R answer[i] = answer[i] * R # R 需要包含右边所有的乘积,所以计算下一个结果时需要将当前值乘到 R 上 R *= nums[i] return answer
时间复杂度:O(N),其中 N指的是数组 nums 的大小。分析与方法一相同。
空间复杂度:O(1),输出数组不算进空间复杂度中,因此我们只需要常数的空间存放变量。