Leetcode刷题日常--1

 首先是读懂题目,丑数是由1开始乘2,乘3或者乘5的数的一个有序序列。要得到第n个丑数,所以我们就需要得到直到n的丑数序列。得到这个序列,需要从1开始乘2,乘3或者乘5,就定义三个索引a,b,c,一开始索引的位置都为0,所以得到三个数n2=dp[a]*2,n3=p[b]*3,n5=p[c]*5,这三个数表示从索引位置的丑数乘2,乘3或者乘5得到的新的丑数。当乘以2后,乘以2的索引a++,乘3和乘5一样。由于序列是有序的,所以我们需要得到这三个数的最小值将其加入到序列中,如果加入的数为n2,则乘2的索引a++,如果加入的数为n3,则乘3的索引b++,如果加入的数为n5,则乘2的索引c++。由于n2,n3,n5可能互相相等,所以对三个位置的数都要进行判断是否为新加的丑数,如果是则索引位置加1,直到得到第n个丑数。

public class Solution {
    public int NthUglyNumber(int n) {
        int[] dp = new int[n];
        dp[0] = 1;
        int a=0,b=0,c=0;
        for(int i=1;i<n;i++)
        {
            int n2 = dp[a]*2, n3 = dp[b]*3, n5 = dp[c]*5;
            int min = Math.Min(Math.Min(n2,n3),n5);
            dp[i] = min;
            if(dp[i] == n2)
                a++;
            if(dp[i] == n3)
                b++;
            if(dp[i] == n5)
                c++;
        }
        return dp[n-1];
    }
}

  

原文地址:https://www.cnblogs.com/sjp737420/p/14587410.html