剑指 Offer 49. 丑数
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
动态合并数组——动态规划
思路
丑数的排列
假设当前存在 3 个数组 nums2, nums3, nums5 分别代表丑数序列从 1 开始分别乘以 2, 3, 5 的序列, 即
nums2 = {1*2, 2*2, 3*2, 4*2, 5*2, 6*2, 8*2...}nums3 = {1*3, 2*3, 3*3, 4*3, 5*3, 6*3, 8*3...}nums5 = {1*5, 2*5, 3*5, 4*5, 5*5, 6*5, 8*5...}//显然抽数序列为上述序列的merge
那么, 最终的丑数序列实际上就是这 3 个有序序列对的合并结果, 计算丑数序列也就是相当于 合并 3 个有序序列。
算法
- 设置i,j,k三个指针分别指向上述序列对应处。
- 合并上述序列直到满足n
实现
int nthUglyNumber(int n) {vector<int> dp(n,0);dp[0]=1;int i=0,j=0,k=0;//合并三个有序序列for(int p=1;p<n;p++){int vi=2*dp[i],vj=3*dp[j],vk=5*dp[k];int minV=min(min(vi,vj),vk);dp[p]=minV;//重复元素便跳过。i+=vi==minV;j+=vj==minV;k+=vk==minV;}return dp.back();}
复杂度分析
- 时间复杂度:
- 空间复杂度:
算法2
思路
算法
实现
复杂度分析
- 时间复杂度:
- 空间复杂度:
题目标题难度划分
| 星级 | 题目难度 |
|---|---|
| ☆ | 简单 |
| ☆☆ | 中等 |
| ☆☆☆ | 困难 |
算法掌握难度程度划分
| 星级 | 掌握难度 |
|---|---|
| 无 | 普通 |
| ❤ | 经典,易掌握 |
| ❤❤ | 经典,略难掌握 |
| ❤❤❤ | 困难 |
