问题
在解决欧拉计划8号问题时(找出1000位数中相邻5个数字的最大乘积),是否有更好的方法,避免使用蛮力法计算所有可能的乘积并选择最大值。
有没有更有效率的算法?或者只能使用蛮力法?
附注
- 这不是一道作业题目。
- 我并不要求问题8的答案。
问题
在解决欧拉计划8号问题时(找出1000位数中相邻5个数字的最大乘积),是否有更好的方法,避免使用蛮力法计算所有可能的乘积并选择最大值。
有没有更有效率的算法?或者只能使用蛮力法?
附注
O(d)
的时间复杂度解决此问题,其中d是输入数字的位数。old_value / left_most_ele * new_right_ele
。对于范围内的每个索引i
[0,d-5],继续执行此操作,并找到最大的窗口值。由于这个问题要求 连续数字,所以在这种情况下,“暴力破解”意味着 O(n),其中 n 是数字的位数(1000)。只要数字中没有某种模式,你就需要 n 步来扫描数字,因此这是最快的解决方案。
你可以缓存最后 4 个数字的乘积或进行类似的技巧,但你肯定不会比 O(n) 更好。
优化之一是计算前五位数字的乘积,在每次迭代中乘以下一个数字并除以前一个数字(移动窗口)。
另一种优化是立即丢弃所有在0
周围的数字。