丑数
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
可能刚开始没看懂题意,这里解释一下
1是丑数,然后是质因数为2,3,5的数
就是说4是两个丑数2相乘得到的一个丑数
6是2*3的到的丑数
8是2*4得到的丑数
就是说丑数是由前面的一个丑数乘以2或3或5得到的。
题解:如何得到前一个丑数那,
存放丑数数组res,res数组里的第一个元素为1。因为我们要让丑数数列有序,所以要每次使这三个因子组成的最小的数进入数组。
t2表示乘以2得到的丑数,t3表示乘以3得到的丑数,t5是乘以5得到的丑数,
把最小的进入丑数数组res
res: 1
t2: 2
t3: 3
t5: 5
比较(2,3,5)->min_n = 2, 2进入 res
res:1 2
t 2: 4
t 3: 3 6
t 5: 5 10
然后比较当前的值(4,3,5),3再进入res
res 1 2 3
t 2: 4
t 3: 6 9
t 5: 5 10
(4, 5, 6) 得到4进入res
class Solution { public: int GetUglyNumber_Solution(int index) { // 1--6都是丑数 if(index < 7) return index; vector<int>res(index); res[0] = 1; // t2 就是乘以2的丑数,t3就是乘以3的丑数,t5就是乘以5的丑数 int t2 = 0, t3 = 0, t5 = 0; for(int i = 1; i < index; i++) { // 三个丑数中选取最小的(2,3,5) 作为下一个丑数 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]; } };