Given an array of n integers where n > 1, nums
, return an array output
such that output[i]
is equal to the product of all the elements of nums
except nums[i]
.
Solve it without division and in O(n).
For example, given [1,2,3,4]
, return [24,12,8,6]
.
Follow up:
Could you solve it with constant space complexity? (Note: The output array does not count as extra space for the purpose of space complexity analysis.)
根据题意,就是要求list中的所有数字都乘起来,然后把当前位置的数字除了的结果填在当前位置。但是限定条件是要求不要用除法,并且不要用额外的空间,除了可以使用用于返回的result list。
class Solution(object):
def productExceptSelf(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res = [1]*len(nums)
# left to right
for i in xrange(1, len(nums)):
res[i] = res[i-1] * nums[i-1]
temp = 1
# right to left
for i in xrange(len(nums)-1, -1, -1):
res[i] *= temp
temp *= nums[i]
return res
可以来回扫两次解决。
第一次的时候,假设我们得到的input列表[a, b, c, d],我们有一个用于返回的result列表,都是1.
for i in xrange(1, len(nums)):
res[i] = res[i-1] * nums[i-1]
这样我们能得到一个新的result。[1, 1*a, 1*a*b, 1*a*b*c]。
然后能发现最后一个位置的值已经是我们需要的了。第二次同理从右往左。
temp = 1
for i in xrange(len(nums)-1, -1, -1): # for i in range(0, len(nums))[::-1]
res[i] *= temp
temp *= nums[i]
有一个temp记录,依次往回,1,1*d,1*d*c,1*d*c*b.
最后得到的结果就是result = [1*b*c*d*1, 1*a*c*d*1, 1*a*b*d*1, 1*a*b*c*1], 刚好符合题意。