剑指Offer(三十三):丑数(C++/Python)

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

解题思路

最直观的方法是逐一进行判断,直到找到第N个丑数。很明显这种方法复杂度很大,进一步考虑,丑数是只包含质因子2、3和5的数,另一方面如果仅仅由质因子2、3和5相乘得到的数一定不包含其他的质因子,也就是为丑数。

我们创建一个数组ugly用来保存丑数,数组中的丑数已经排好序,接下来如何生成下一个按顺序的丑数,该丑数一定为前面某一个丑数*2或*3或*5得到的,用三个指针记录哪个丑数*2或*3或*5可以超过当前最大的丑数。

C++版

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        vectorugly(index + 1);
        ugly[0] = 1;
        int n2 = 0, n3 = 0, n5 = 0;
        for(int i = 1; i <= index; ++ i){
            ugly[i] = min(ugly[n2] * 2,ugly[n3] * 3);
            ugly[i] = min(ugly[i],ugly[n5] * 5);
            if(ugly[i] == ugly[n2] * 2)
                ++ n2;
            if(ugly[i] == ugly[n3] * 3)
                ++ n3;
            if(ugly[i] == ugly[n5] * 5)
                ++ n5;
        }
        return ugly[index - 1];
    }
};

Python版

class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        n2, n3, n5 = 1, 1, 1
        ugly = [0,1]
        for i in range(0, index):
            num = min(min(ugly[n2]*2, ugly[n3]*3), ugly[n5]*5)
            if num == ugly[n2]*2:
                n2 += 1
            if num == ugly[n3]*3:
                n3 += 1
            if num == ugly[n5]*5:
                n5 += 1
            ugly.append(num)
        return ugly[index]

 

你可能感兴趣的:(剑指Offer)