[剑指 Offer] 49. 丑数

2021/3/30,今天做了一个听闻已久的题:丑数。题意如下:
在这里插入图片描述
首先判断一个数是不是丑数并不困难,让这个数一直除2,3,5直到除不尽为止,如果能除尽就是丑数。但是这个题让找第n个丑数,首先我想到的是打表,但是复杂度太高超时了。后来看了题解学习了一种做法,下一个丑数一定是之前的某一个丑数乘2,3,5乘出来的,并且是他们中最小的那一个。但是要实现这个有点困难,看了题解的代码觉得真的牛哇,具体实现看代码:

class Solution {
public:
    int nthUglyNumber(int n) {
     vector<int> ans(n);
     ans[0]=1;
     int a=0,b=0,c=0;
     for(int i=1;i<n;i++)// 在已有的丑数序列上每一个数都必须乘2, 乘3, 乘5, 这样才不会漏掉某些丑数
     {
          int a1=ans[a]*2,b1=ans[b]*3,c1=ans[c]*5;
         ans[i]=min(a1,min(b1,c1));
          if(ans[i]==a1)
          ++a;
          if(ans[i]==b1)
          ++b;
          if(ans[i]==c1)
          ++c;
     }
     return ans[n-1];
    }
};

时间复杂度O(N),空间复杂度O(N)。
参考资料
·Krahets《剑指 Offer 49. 丑数(动态规划,清晰图解)》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值