【leetcode】264.丑数2

题目

264. 丑数 II

给你一个整数 n ,请你找出并返回第 n丑数

**丑数 **就是只包含质因数 23 和/或 5 的正整数。

示例 1:

**输入:**n = 10
**输出:**12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

**输入:**n = 1
**输出:**1
**解释:**1 通常被视为丑数。

思路1

从1开始遍历所有整数,遇到丑数则count++, 直到第n个丑数。不过这种超时了。

java代码1

    public int nthUglyNumber(int n) {
        if(n <= 1) {
            return 1;
        }
         
        int count=0;
        for(int i=1;;i++) {
            if(isUgly(i)) {
                count++;

                if(count == n) {
                    return i;
                }   
            }

        }
    }

    private boolean isUgly(int n) {
        if(n <= 0) {
            return false;
        }

        int[] factors = new int[]{2,3,5};

        for(int i : factors) {
            while(n % i == 0) {
                n = n/i;
            }
        }

        return n == 1;
    }
}

思路2

动态规划思想。后面的丑数一定是由前面的丑数乘以2、3或5得到。所以第n个丑数一定是由前n-1个数中的某3个丑数(分别记为index2、index3、index5)分别乘以2、3或者5得到的数中的最小数,index2,index3,index5有个特点,即分别乘以2、3、5得到的数一定含有比第n-1个丑数大(可利用反证法:否则第n-1个丑数就是它们当中的一个)最小丑数,即第n个丑数由u[index2]*2、u[index3]*3、u[index5]*5中的最小数得出。让它们分别和第n个丑数比较,若和第n个丑数相等,则更新它们的值。注:一次最少更新一个值(如遇到第n个丑数是6时,index2和index3都要更新)。

java代码2

class Solution {
    public int nthUglyNumber(int n) {
        int[] u = new int[n];
        u[0] = 1;

        int index2 = 0;
        int index3 = 0;
        int index5 = 0;

        int k=1;
        while(k < n) {
            u[k] = min (u[index2]*2, u[index3]*3, u[index5]*5);
            if(u[k] == u[index2]*2) index2++;
            if(u[k] == u[index3]*3) index3++;
            if(u[k] == u[index5]*5) index5++;
            k++;
        }

        return u[n-1];
    }

    private int min(int a, int b, int c) {
        return a>b?(b>c?c:b):(a>c?c:a);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值