此题想要返回的是一个数组中每个元素除自身以外其他元素的乘积,并且不能使用除法操作。要求O(n)的时间复杂度,我们可以梳理一下,对于一个数组而言,采用O(n)的时间复杂度可以得到哪些东西:最大最小值均值求和,每个位之前的求和求最大最小和均值。正是使用这些O(n)能够得到这些最基本的信息,来构建整个题目的解。一开始我采用的是类似递归的思想来进行求解,发现这样做会使得复杂度更高。我们将整个问题拆分,既然是想要求得除该元素之外的所有元素的乘积,那么解就等于该元素左边元素的乘积乘以该元素右边元素的乘积。并且对于每个位上其左右两边元素的乘积我们都是可以通过O(n)的时间复杂度来得到的。所以此题解决方案如上所述。
进阶:需要采用常数的空间复杂度,思路就是利用返回结果的那个数组,这个自己还没有实现,下次复习时再做,思路和上述一样。代码如下:
class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
left = []
right = []
result = []
left_value = 1
right_value = 1
for i in range(len(nums)):
left.append(left_value*nums[i])
left_value = left_value * nums[i]
for i in range(len(nums)-1, -1, -1):
right.append(right_value*nums[i])
right_value = right_value * nums[i]
for i in range(len(nums)):
if i == 0:
result.append(right[len(nums)-i-2])
elif i == len(nums)-1:
result.append(left[i-1])
else:
result.append(left[i-1]*right[len(nums)-i-2])
return result