ugly-number-ii 丑数II

设计一个算法,找出只含素因子235 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...

ugly-number-ii

样例

样例 1:

输入:9
输出:10

样例 2:

输入:1
输出:1
分析:假设数组ugly[N]中存放不断产生的丑数,初始只有一个丑数ugly[0]=1,由此出发,下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2, ugly[0]*3, ugly[0]*5, 显然最小的那个数是新的丑数,所以第2个丑数为ugly[1]=2,开始新一轮的竞争,由于上一轮竞争中,因子2获胜,这时因子2应该乘以ugly[1]才显得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5, 因子3获胜,ugly[2]=3,同理,下次竞争时因子3应该乘以ugly[1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5获胜,得到ugly[3]=5,重复这个过程,直到第n个丑数产生。总之:每次竞争中有一个(也可能是两个或三个)因子胜出,下一次竞争中 胜出的因子就应该乘下一个数。

public class Solution {
    /**
     * @param n: An integer
     * @return: return a  integer as description.
     */
    public int nthUglyNumber(int n) {
        // write your code here
        
        int i = 0;
        int j = 0;
        int k = 0;
        int index = 1;
        int[] dp = new int[n];
        dp[0] = 1;
        while (index < n) {
            dp[index] = Math.min(Math.min(dp[i] * 2, dp[j] * 3), dp[k] * 5);

            if (dp[index] == dp[i] * 2) {
                i++;
            }
            if (dp[index] == dp[j] * 3) {
                j++;
            }
            if (dp[index] == dp[k] * 5) {
                k++;
            }
            index++;
        }
        return dp[n - 1];
    }
}

Github 地址: https://github.com/xingfu0809/Java-LintCode

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值