LeetCode264. Ugly Number II

题目链接:

https://leetcode.com/problems/ugly-number-ii/

题目描述:

找出第n个丑数。
丑数:1是一个特殊的丑数,其次只含有2,3,5质因数的数被定义为丑数。

题目分析:

诶,自己做没做出来。

http://www.geeksforgeeks.org/ugly-numbers/
可以参考这个很详细哒。

根据动态规划的思想,当前的丑数肯定是由之前某个丑数乘2或乘3或乘4得到。这样就能得到一个生成链,麻烦的是这个生产链得是有序的。用三个指针idx2,idx3,idx4来保证有序。
且我们要保证每次迭代选择的都是最小的丑数。
factor2表示2*之前的某个丑数,idx2表示之前那个丑数的下标。当factor2被更新了,那么idx2指针也要前进一位。

代码:
class Solution {
public:
    int minAmongThree(int a,int b,int c){
        int minNum=a<b?a:b;
       return minNum<c?minNum:c;
    }
    int nthUglyNumber(int n) {
        vector<int> uglyNums(n,0);
        uglyNums[0]=1;
        int idx2,idx3,idx5;
        idx2=idx3=idx5=0;
        int factor2=1,factor3=1,factor5=1;
        for(int i=0;i<n;i++){
            uglyNums[i]=minAmongThree(factor2,factor3,factor5);
            if(factor2==uglyNums[i]){
                factor2=2*uglyNums[idx2++];
            }
            if(factor3==uglyNums[i]){
                factor3=3*uglyNums[idx3++];
            }
            if(factor5==uglyNums[i]){
                factor5=5*uglyNums[idx5++];
            }
        }
        return uglyNums[n-1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值