时间效率与空间效率的平衡-面试题34-丑数

题目描述

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

解法

1、逐个判断每个整数是不是丑数的解法

bool isUgly(int num) {
        if(num==0)return false;
        if(num==1)return true;
        while(num>=2 && num%2==0)num/=2;
        while(num>=3 && num%3==0)num/=3;
        while(num>=5 && num%5==0)num/=5;
        
        return num==1;
    }
这样做的缺点就是不管是不是丑数都要进行计算,因此效率不高

2、创建数组保存已经找到的数组,用空间换时间的解法

根据丑数的定义,丑数应该是另一个丑数乘以2、3、5的结果(1除外)。因此我们可以创建一个数组,里面是排好序的数组,每个丑数都是前面的丑数乘以2,3,5得到的。

我们用T2、T3、T5来分别表示当前数乘以2,乘以3,乘以5时的结果(T2,T3,T5代表数组的下标),那么下一个丑数就是这些结果的最小值。因为已有的丑数是按顺序存放在数组中,每次生成新的丑数的时候,我们需要更新T2,T3,T5的下标。

Code:

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        vector<int> res;
        res.push_back(1);
        
        int T2=0;
        int T3=0;
        int T5=0;
        
        while(res.size()<index){
            int min=Min(res[T2]*2,res[T3]*3,res[T5]*5);
            res.push_back(min);
            while(res[T2]*2<=min)
                T2++;
            while(res[T3]*3<=min)
                T3++;
            while(res[T5]*5<=min)
                T5++;
        }
        return res[index-1];
    }
    int Min(int x,int y,int z){
        int min=x<y?x:y;
        return min<z?min:z;
    }
};


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