当前位置: 首页剑指offer刷题第七期问题详情 【动态规划专题】剑指 Offer 49. 丑数 本问题对应课程链接:剑指offer刷题第七期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 7 个回答
1
解题思路
– 按照顺序去2/3/5的倍数去找
– 初始的2,3,5
– 2:22=4,23=6,25=10
– 3: 32=6,33=9,35=15
– 5:52=10,53=15,55=25
– 存在两个问题,一个是重复,另外一个是可能会跳过一些数字
– 如何解决呢?需要用2,3,5三个独立指针去遍历dp[]。把dp[]作为备选池都可以分别去乘以2,3,5,但是我们需要先把最小的作为新的dp[]追加进去,注意并不是2,3,5依次按顺序去乘以,比如22=4,23=6乘以2次,都比52=10的1次要大。因而2,3,5分别去维护独立的index,然后慢慢去++
【题解1】
定义p2,p3,p5,表示dp[px]*x是下一个丑数
通过乘2,3,5得到全部的丑数
时间复杂度O(N),空间复杂度O(N)。
//每个丑数可以通过乘2,3,5得到
int a = 0, b = 0, c = 0;
int[] res = new int[n];
res[0] = 1;
for(int i = 1; i < n; i++) {
int n2 = res[a] * 2, n3 = res[b] * 3, n5 = res[c] * 5;
res[i] = Math.min(Math.min(n2, n3), n5);
if (res[i] n2) a++;
if (res[i] n3) b++;
if (res[i] n5) c++;
}
return res[n – 1];
思路: 每个丑数都可以由其他较小的丑数通过乘以 2 或 3 或 5 得到