题目要求:请不要使用除法,且在 O(n)
时间复杂度内完成此题。
如果可以使用除法,该题怎么做?
先计算给定数组所有元素的乘积,然后对数组中的每个元素 x,将总的乘积除以 x 来求得除自身值的以外数组的乘积。
然而这样的解决方法有一个问题,就是如果输入数组中出现 0,那么这个方法就失效了。
除自身以外数组的乘积 - 乘积前后缀
func productExceptSelf(nums []int) []int {
n := len(nums)
if n <= 1 {
panic("len(nums) <= 1")
}
res := make([]int, n)
pre := make([]int, n - 1)
pre[0] = nums[0]
for i := 1; i < n - 1; i++ {
if nums[i] == 0 {
break
}
pre[i] = pre[i - 1] * nums[i]
}
suf := 1
for i := n - 1; i > 0; i-- {
res[i] = pre[i - 1] * suf
suf *= nums[i]
}
res[0] = suf
return res
}
除自身以外数组的乘积 - 乘积前后缀(空间优化)
由于输出数组不算在空间复杂度内,那么可以将 pre
数组用输出数组来计算。
func productExceptSelf(nums []int) []int {
n := len(nums)
if n <= 1 {
panic("len(nums) <= 1")
}
res := make([]int, n)
res[0] = nums[0] // res -> pre
for i := 1; i < n - 1; i++ {
if nums[i] == 0 {
break
}
res[i] = res[i - 1] * nums[i]
}
suf := 1
for i := n - 1; i > 0; i-- {
res[i] = res[i - 1] * suf
suf *= nums[i]
}
res[0] = suf
return res
}