238.M 除自身以外数组的乘积
Problem: 238. 除自身以外数组的乘积
思路
如果可以用除法的话,此题很简单,先计算所有数组的乘积,然后再除以当前位置的数字,即可得到当前位置的结果。
由于不能用除法,考虑用除法,每个位置的结果等于 左侧所有数字的乘积 * 右侧所有数字的乘积
。初始化两个数组,left用于存储左侧数字的乘积,right用于存储右侧数字的乘积。对于位置i
来说,结果等于 left[i-1]*right[i+1]
以上解法空间复杂度不是O(1),为了减少空间,可以用ans数组来充当left数组的功能,然后从右侧开始逐渐计算结果,这样只需要一个数字即可保存右侧n个数字的乘积。
Code
解法一:
func productExceptSelf(nums []int) []int {
left := make([]int, len(nums))
left[0] = nums[0]
right := make([]int, len(nums))
right[len(nums)-1] = nums[len(nums)-1]
for i := 1; i < len(nums); i++ {
left[i] = left[i-1] * nums[i]
}
for i := len(nums) - 2; i >= 0; i-- {
right[i] = right[i+1] * nums[i]
}
ans := make([]int, len(nums))
ans[0] = right[1]
ans[len(nums)-1] = left[len(nums)-2]
for i := 1; i < len(nums)-1; i++ {
ans[i] = left[i-1] * right[i+1]
}
return ans
}
解法二:
func productExceptSelf(nums []int) []int {
ans := make([]int, len(nums))
ans[0] = nums[0]
for i := 1; i < len(nums); i++ {
ans[i] = ans[i-1] * nums[i]
}
right := 1
for i := len(nums) - 1; i > 0; i-- {
ans[i] = ans[i-1] * right
right *= nums[i]
}
ans[0] = right
return ans
}
···
Last updated
Was this helpful?