题目要求:请不要使用除法,且在  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
}