大家好,我是新熊君。
今天跟大家分享一道阿里的算法面试题。
题目描述
给定一个正整数,把它拆分为若干个数的和,记这若干个数的积为
,求
的最大值。
题目分析
这道题正常的思路是使用动态规划算法。
假设 为正整数
拆分后能够得到最大的积。
状态转移时只需要遍历小于的每一个正整数
,
取 的最大值,即:
时间复杂度,空间复杂度
进一步分析
假设把个数拆分成
个数之和,乘积为
,有:
由均值不等式:
将和
代入上式得:
故本质是求的最大值。
两边同时取对数,得:
令:
求导后得到:
则当时取得最大值
因为e的值与3最接近,所以最终得到一个优化的算法:
先对尽可能多地拆分3:
如果剩余的数为2或0,则拆分结束。
如果剩余的数为1,则将拆分好的3拿一个与剩余的1组合拆分成两个2。
此题得解。
只需要使用快速幂求一下幂次即可,
时间复杂度,空间复杂度
。
用高中数学就解决了这道面试算法题。