剑指 Offer 49. 丑数
剑指 Offer 49. 丑数
多路归并+dp,可以看出所有的丑数都是由质因数,,乘上比它更小的丑数得到的,于是,现在假设有3个数组,分别是:
A:{12,22,32,42,52,62,82,102......}
B:{13,23,33,43,53,63,83,103......}
C:{15,25,35,45,55,65,85,105......}
那么所有丑数的排列,必定就是上面ABC3个数组的合并结果然后去重得到的,那么这不就转换成了三个有序数组的无重复元素合并的问题了吗?
而这三个数组就刚好是{1,2,3,4,5,6,8,10....}乘以2,3,5得到的。
定义当前每个数组的位置idx[]数组,分别都先指向,再进行多路归并。
class Solution {
public int nthUglyNumber(int n) {
// 丑数数组
int[] dp = new int[n + 1];
dp[1] = 1;
int[] idx = {1, 1, 1};
for(int i = 2; i <= n; i++) {
while(dp[idx[0]] * 2 <= dp[i - 1]) {
idx[0]++;
}
while(dp[idx[1]] * 3 <= dp[i - 1]) {
idx[1]++;
}
while(dp[idx[2]] * 5 <= dp[i - 1]) {
idx[2]++;
}
dp[i] = Math.min(dp[idx[0]] * 2, Math.min(dp[idx[1]] * 3, dp[idx[2]] * 5));
}
return dp[n];
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)