丑数

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
 
 
思路:利用set的不重复性质和有序性,插入每一个数的2,3,5的倍数,
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index == 0){
            return 0;
        }else{
            set<long long> s;
            set<long long> s1;
            set<long long> ans;
            s.insert(1);
            s.insert(2);
            s.insert(3);
            s.insert(5);
            ans.insert(1);
            ans.insert(2);
            ans.insert(3);
            ans.insert(5);
            set<long long>::iterator it;
            while(true){
                int len = ans.size();
                if(len>index){
                    break;
                }
                for(it=s.begin();it!=s.end();it++){
                s1.insert((*it)*2);
                s1.insert((*it)*3);
                s1.insert((*it)*5);
                ans.insert((*it)*2);
                ans.insert((*it)*3);
                ans.insert((*it)*5);
                }
                s = s1;
                s1.clear();
            }
            while(true){
                int len = ans.size();
                if(len>index*2){
                    break;
                }
                for(it=s.begin();it!=s.end();it++){
                s1.insert((*it)*2);
                s1.insert((*it)*3);
                ans.insert((*it)*2);
                ans.insert((*it)*3);
                }
                s = s1;
                s1.clear();
            }
            while(true){
                int len = ans.size();
                if(len>index*3){
                    break;
                }
                for(it=s.begin();it!=s.end();it++){
                s1.insert((*it)*2);
                ans.insert((*it)*2);
                }
                s = s1;
                s1.clear();
            }
            
            int k = 1;
            for(it=ans.begin();it!=ans.end();it++){
                if(k == index){
                    return (*it);
                }else{
                    k++;
                }
            }
        }
        return 1;
    }
};

优秀题解:

数组存放所有2,3,5的倍数,

利用t2,t3,t5三个数(从0开始,表示),来控制 各倍数 不同的进度,保证每个数都能被乘2,3,5;

t2 表示 v[t2]内的数乘2  ,t3 表示 v[t3]内的数乘3 ,t5 表示 v[t5]内的数乘5  ,  

min函数保证,每次都选出最小的数,比如这个数是v[t3]*3,说明v[t3]内的数已经乘过3,该令t3++,寻找下一个数

class Solution {:
public: int GetUglyNumber_Solution(int index) { if (index < 7)return index; vector<int> res(index); res[0] = 1; int t2 = 0, t3 = 0, t5 = 0, i; for (i = 1; i < index; ++i) { res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5)); if (res[i] == res[t2] * 2)t2++; if (res[i] == res[t3] * 3)t3++; if (res[i] == res[t5] * 5)t5++; } return res[index - 1]; } };

 

posted @ 2019-04-25 01:34  萌新上路  阅读(113)  评论(0编辑  收藏  举报