Given an array nums
of n integers where n > 1, return an array output
such that output[i]
is equal to the product of all the elements of nums
except nums[i]
.
Example:
Input:[1,2,3,4]
Output:[24,12,8,6]
Note: Please solve it without division and in O(n).
Follow up:
Could you solve it with constant space complexity? (The output array does not count as extra space for the purpose of space complexity analysis.)
要求不能用除法,空间复杂度也要求固定空间。
最开始的想法很简单,就是用list切片的方法,把num乘以其他位置所有数。
不过这样并不是常量空间,速度也非常慢。
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
import numpy as np
ans=np.ones(len(nums))
for i,num in enumerate(nums):
ans[:i]*=num
ans[i+1:]*=num
return list(map(int,ans))
看了discuss中的一个方法,很受启发。
比如nums是 [1 2 3 4 5]
经过第一个for循环ans是[- 1 12 123 1234],也就是每个位置保存的是它之前所有数的乘积
第二个for循环的p是 [2345 345 45 5 -],也就是它之后所有数的乘积
所以相乘后,ans最后结果
[2345, 1345, 1245, 1235, 1234]
class Solution:
def productExceptSelf(self, nums: List[int]) -> List[int]:
ans = []
p=1
for i in range(len(nums)):
ans.append(p)
p= p*nums[i]
p=1
for i in range(len(nums)-1,-1,-1):
ans[i]*=p
p= p*nums[i]
return ans