264. Ugly Number II 丑数

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5

Example:

Input: n = 10
Output: 12
Explanation: 
1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note:  

  1. 1 is typically treated as an ugly number.
  2. n does not exceed 1690.

题目:找出第n个分子只包含2、3、5的丑数(通常1也被视作丑数)

思路:

方法1:从1开始,将1*2、1*3、1*5得到2、3、5,将积插入数组中,然后2*2、2*3、2*5得到4、6、10,以此类推....

然后将数组中相同的数合并、排序,最后找出第n位数就是第n位丑数。

缺点:复杂,需要合并和排序,而且不能精确判断计算出的丑数是否满足n位。

方法2:为了精确判断是否已生成第n位丑数,需要按顺序生成丑数。用三个index记录当前丑数是第几位丑数乘以多少生成的。

例如:2是由第一位丑数*2生成的:index2 =0, uglyNum[ i ]=uglyNum[index2]*2

3是由第一位丑数*3生成的:index3 =0, uglyNum[ i ]=uglyNum[index3]*3

4是由第二位丑数*2生成的:index2 =1, uglyNum[ i ]=uglyNum[index2]*2

5是由第一位丑数*5生成的:index5=0, uglyNum[ i ]=uglyNum[index5]*5

6是由第二位丑数*3生成的:index3=1, uglyNum[ i ]=uglyNum[index3]*3

或 由第三位丑数*2生成的:index2=2, uglyNum[ i ]=uglyNum[index2]*2

...

综上可总结规律:

每次得到 X*uglyNum [ indexX ] 的值(X=2、3、5),取最小值minValue作为下一个丑数

若 minValue = X * uglyNum [ indexX ],则indexX=indexX+1

代码:

class Solution {
    public int nthUglyNumber(int n) {
        int index2=0,index3=0,index5=0;
        int[] uglyNums = new int[n];
        uglyNums[0]=1;
        for(int i=1;i<n;i++){
            int uglyNum= Math.min(Math.min(uglyNums[index2]*2,uglyNums[index3]*3),uglyNums[index5]*5);
            if(uglyNum == uglyNums[index2]*2) index2++;
            if(uglyNum == uglyNums[index3]*3) index3++;
            if(uglyNum == uglyNums[index5]*5) index5++;
            uglyNums[i]=uglyNum;
        }
        return uglyNums[n-1];
    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值