丑数
题目描述
把只包含质因子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]; } };