leetcode 313. Super Ugly Number

Write a program to find the nth super ugly number.

Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.

Note:
(1) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
(4) The nth super ugly number is guaranteed to fit in a 32-bit signed integer.



这题除了暴力解法没想到怎么做。只是注意到后面的丑数可以根据前面的丑数计算出来,可以避免重复计算。但是如何顺序的计算出来呢?前面的某个丑数可以乘以所有给出的质数,来得到下一个丑数。

参考了网上的思路:为每个质数维护一个指针,指向前面的丑数。每次计算出最小的   该质数指针指向的的丑数*质数,并且该最小值对应的质数的指针+1。指向下一个丑数。这样时间复杂度为O(n*m),空间复杂度O(n+m)。这样能扫描到所有的丑数。某个丑数可以乘以不同的质数得到新丑数 的情况分别维护在不同的质数指针。这是关键。

代码中,每次新得到一个丑数,某质数指针指向的的丑数*质数 与新增的丑数相等就表明这数是有它得到的。它的指针+1,指向下一个丑数。

public int nthSuperUglyNumber(int n, int[] primes) {
        int[] arr=new int[n];
        int[] points=new int[primes.length];//每个质数的指针
        arr[0]=1;
        for(int i=1;i<n;i++){//小的那个指针+1,但是不用互相比较,只要求出最小的值,再判断是否相等就行了
            arr[i]=arr[points[0]]*primes[0];//初始情况
            for(int j=0;j<points.length;j++){
                arr[i]=arr[i]<arr[points[j]]*primes[j]?arr[i]:arr[points[j]]*primes[j];
            }
            for(int j=0;j<points.length;j++){
                if(arr[points[j]]*primes[j]==arr[i]) points[j]++; 
            }
        }
        return arr[n-1];
    }

阅读更多
个人分类: leetcode and lintcode
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

leetcode 313. Super Ugly Number

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭