1、描述
给定长度为n的整数数组nums,其中n>1,返回输出数组 output,其中output[i] 等于nums中除 nums[i] 之外其余各元素的乘积。
说明:请不要使用除法,且在O(n)时间复杂度内完成
实例:输入:[1, 2, 3, 4]
输出:[24, 12, 8, 6]
2、算法
思想:上三角、下三角,乘积 = 当前数左边的乘积 * 当前数右边的乘积
1)因为空间复杂度要求O(1)、不能使用除法,因此一定需要在乘法过程中得到所有答案;
2)我们可以将res数组列成乘积形式,形成一个矩阵,可以发现矩阵次主角线全部为1(因为当前数字不相乘,因此等价为乘1);
3)因此,我们分别计算矩阵的上三角和下三角,并且在计算过程中储存过程值,最终可以在遍历2遍nums下完成结果计算。
res | |||||
res[0] = | 1 | num[1] | ... | num[n-2] | num[n-1] |
res[1] = | num[0] | 1 | ... | num[n-2] | num[n-1] |
... | ... | ... | ... | num[n-2] | num[n-1] |
res[n-2] = | num[0] | num[1] | ... | 1 | num[n-1] |
res[n-1] = | num[0] | num[1] | ... | num[n-2] | 1 |
func productExceptSelf2(_ nums: [Int])->[Int]{
/*
上三角、下三角
*/
var res: [Int] = [Int].init(repeating: 0, count: nums.count)
var p = 1
var q = 1
for i in 0..<nums.count {
res[i] = p
p *= nums[i]
}
for i in (1...nums.count-1).reversed() {
q *= nums[i]
res[i-1] *= q
}
return res
}