九章算法面试题40 不用除法求积

来源:互联网 发布:云计算平台性能指标 编辑:程序博客网 时间:2024/05/01 15:16

九章算法官网-原文网址

http://www.jiuzhang.com/problem/40/


题目

给定一个数组A[1..n],求数组B[1..n],使得B[i] = A[1] * A[2] .. * A[i-1] * A[i+1] .. * A[n]。要求不要使用除法,且在O(n)的时间内完成,使用O(1)的额外空间(不包含B数组所占空间)。


解答

计算前缀乘积Prefix[i] = A[1] * A[2] .. A[i],计算后缀乘积Suffix[i] = A[i] * A[i+1] .. A[n],易知,B[i] = Prefix[i - 1] * Suffix[i + 1]。实际上无需实际构造出Prefix和Suffix数组,利用B数组从左到右遍历一次得到Prefix[i],然后从右到左遍历一次,计算出所要求的B数组。


面试官角度

这种从前到后遍历和从后到前再遍历一次的方法(Foward-Backward-Traverse)在很多题目中都有借鉴。如九章算法面试题31 子数组的最大差。

0 0
原创粉丝点击