[LeetCode]313. Super Ugly Number超级丑数,丑数系列看这一道就行了

丑数系列的题看这一道就可以了

/*
    和ugly number2差不多,不过这次的质因子多了,所以用数组来表示质因子的target坐标
    target坐标指的是这个质因子此次要乘的前任丑数是谁
     */
    public int nthSuperUglyNumber(int n, int[] primes) {
        //记录相乘坐标,存的是每个质因子对应相乘搭档在丑数数组中的下标
        int[] target = new int[primes.length];
        //动态规划数组
        int[] dp = new int[n];
        //第一个丑数是0
        dp[0] = 1;
        for (int i = 1; i < n; i++) {
            //每次都要把所有质因子都乘上对应数试试,维护一个min和一个index
            int min  = Integer.MAX_VALUE;
            int index = 0;
            for (int j = 0; j < primes.length; j++) {
                if (min>primes[j]*dp[target[j]])
                {
                    min = primes[j]*dp[target[j]];
                    index = j;
                }
                //别忘了,如果有另外的质因子也组成了相同的数,那么这个质因子的target要跳过
                //因为得到相同丑数的组合只保留一种即可
                //在丑数2中,由于是分别判断2,3,5,所以重复的组合都跳过了
                else if (min==primes[j]*dp[target[j]]) target[j]++;
            }
            //更新dp和target
            dp[i] = min;
            target[index]++;
        }
        return dp[n-1];
    }
原文地址:https://www.cnblogs.com/stAr-1/p/8478811.html