264. Ugly Number II

来源:互联网 发布:为什么金九银十 知乎 编辑:程序博客网 时间:2024/06/05 18:15

1、题目描述

质因数只有2,3,5的正整数是丑数 ,返回第n个丑数(1 base)。


2、思路

方法1:有三个集合 v1,v2,v3分别保存含有2,3,5的;含有3,5的;只含有5丑数。

每次取三个集合的头元素的最小值,然后取了那个集合的元素,要及时地对其进行后续数字的补充。

找到第n个数字即可。


方法2:

a,b,c为三个计数变量。数组ans为丑数队列,丑数中的每一个元素,都可以分别乘以2,3,5来得到一个新的丑数,

但有可能会有重复,比如2*3与3*2都是6。

为了找下一个丑数,应先找出ans[a]*2,ans[b]*3,ans[c]*5的最小值,

这个最小值是从哪个地方产生的(可能不止一处),那么对应的计数变量要加1.



3、代码

方法1:

    int nthUglyNumber(int n) {        set<long>v1,v2,v3;        v1.insert(2);        v2.insert(3);        v3.insert(5);        long m=1;        for(int i=1;i<n;i++){            long a = *(v1.begin());            long b = *(v2.begin());            long c = *(v3.begin());            m = min(a,min(b,c));            if(m==a){                v1.insert(m*2);                v1.insert(m*3);                v1.insert(m*5);                v1.erase(v1.begin());            }             else if(m==b){                v2.insert(m*3);                v2.insert(m*5);                v2.erase(v2.begin());            }             else if(m==c){               v3.insert(m*5);               v3.erase(v3.begin());             }         }        return m;    }

方法2:

    int nthUglyNumber(int n) {        vector<int>ans;        ans.push_back(1);        int a=0,b=0,c=0;        for(int i=1;i<n;i++){            int m = min(ans[a]*2,min(ans[b]*3,ans[c]*5));            ans.push_back(m);            if(m==ans[a]*2) a++;            if(m==ans[b]*3) b++;            if(m==ans[c]*5) c++;        }        return ans[n-1];    }



原创粉丝点击