LeetCode 题解:剑指 Offer 49. 丑数,三指针,JavaScript,详细注释
原题链接:剑指 Offer 49. 丑数
解题思路:
参考了详细通俗的思路分析,多解法中的解法三。
在使用堆的解法中,每一个丑数都是由之前最小的丑数分别乘以 2、3、5 计算而来,生成的序列如下:
1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, …
如果将其拆分则是下面这样的:
1, 1×2, 1×3, 2×2, 1×5, 2×3, 2×4, 3×3, 3×4, 3×5...
按照上面的规律,可以将其按照各个质因数将其拆分成下面三组:
复制代码
我们可以注意到,被乘数的规律和丑数是一样的。
我们可以使用三个指针,分别表示上面三组的被乘数在丑数序列中的位置,也就知道了它当前所需要进行的计算。例如当前乘 2 指针指向的是丑数 5,就表示当前乘 2 指针需要进行
5×2
运算。三个指针分别计算出的结果,取最小值,就是下一个丑数的值。同时这个被取最小值的运算,才是当前真实要实行的运算,因此要将对应的指针向前移动一位。
这样循环计算可以保证每次计算的结果都是最优的,也就保证了丑数从小到大的排列顺序,这样计算 n 次就得到了第 n 个丑数。
复制代码
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/6ead87c39b81bd145e14e039f】。文章转载请联系作者。
评论