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

来源:互联网 发布:慢镜头软件下载 编辑:程序博客网 时间:2024/05/01 15:45

题目描述

把只包含因子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;    }};


0 0
原创粉丝点击