ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

剑指 Offer 49. 丑数

2021-05-17 21:29:29  阅读:162  来源: 互联网

标签:丑数 Offer min 因子 let 49 10


剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
说明:

1 是丑数。
n 不超过1690。

注意:是找只包含质因子2,3,5的数,而不是找质因子只有2,3,5的数,本人就因为看错题然后思路一直错。

动态规划,状态转移方程:f[i] = min (f[a]*2,f[b]*3,f[c]*5)

f[i]代表第i-1个丑数,f[0]是第一个丑数。
难理解的点:a,b,c怎么求?

min (f[a]*2,f[b]*3,f[c]*5)表示的是大于f[i-1]的最小值,f[i-1]也就是上一个丑数,求下一个丑数f[i],则需要找到最接近f[i-1]的丑数,这是可以用a,b,c三个下标表示大于f[i-1]的最小值,a,b,c的初始值0,当更新下一个丑数时, 因为(f[a]*2,f[b]*3,f[c]*5)中的任意一个值肯定大于上一个丑数,只需要判断是否等于新增的丑数,如果等于,就让下标加1。

var nthUglyNumber = function(n) {
   let a,b,c;
   a=b=c=0;
   let f=new Array(2000)
   f[0]=1;
   for(let i=1;i<n;i++){
     f[i]=Math.min(f[a]*2,f[b]*3,f[c]*5);//求第i-1个丑数

     //判断是否需要更新a,b,c的值
     if(f[i]==f[a]*2)a++;
     if(f[i]==f[b]*3)b++;
     if(f[i]==f[c]*5)c++;
   }
   return f[n-1]//代表第n个丑数,因为f[0]是第一个丑数
 };

标签:丑数,Offer,min,因子,let,49,10
来源: https://blog.csdn.net/laoxiaohang/article/details/116949505

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有