基础版本:
bool IsUglyNum(int64_t data)
{
int64_t curData = data;
while (curData % 2 == 0) curData /= 2;
while (curData % 3 == 0) curData /= 3;
while (curData % 5 == 0) curData /= 5;
return 1 == curData ? true : false;
}
int64_t GetUglyNum(int destIdx)
{
if (destIdx < 0) return -1;
int64_t destData = 1;
for (int curIdx = 0, curData = 1; curIdx != destIdx; ++curData)
{
if (IsUglyNum(curData))
{
++curIdx;
destData = curData;
}
}
return destData;
}
高效版本:
int64_t MinOfThree(int64_t left, int64_t middle, int last)
{
int finalData = left < middle ? left : middle;
finalData = finalData < last ? finalData : last;
return finalData;
}
int64_t GetUglyNum(int destIdx)
{
if (destIdx < 0) return -1;
int64_t* pTempData = new int64_t[destIdx];
pTempData[0] = 1;
int64_t* firstBiggerPMultiBy2 = pTempData;
int64_t* firstBiggerMultiBy3 = pTempData;
int64_t* firstBiggerMultiBy5 = pTempData;
for (int curIdx = 1; curIdx != destIdx; ++curIdx)
{
int64_t curMaxNum = pTempData[curIdx - 1];
while (*firstBiggerPMultiBy2 * 2 <= curMaxNum) ++firstBiggerPMultiBy2;
while (*firstBiggerMultiBy3 * 3 <= curMaxNum) ++firstBiggerMultiBy3;
while (*firstBiggerMultiBy5 * 5 <= curMaxNum) ++firstBiggerMultiBy5;
int64_t destNum = MinOfThree(*firstBiggerPMultiBy2 * 2, *firstBiggerMultiBy3 * 3, *firstBiggerMultiBy5 * 5);
pTempData[curIdx] = destNum;
}
int destNum = pTempData[destIdx - 1];
delete[] pTempData;
return destNum;
}
本文介绍了两种算法来查找第N个丑数,即只包含质因数2、3和5的正整数。基础版本使用循环判断每个数是否为丑数,而高效版本采用动态规划,利用三个指针分别跟踪乘以2、3、5的最小丑数,避免重复计算。
1069

被折叠的 条评论
为什么被折叠?



