题目:丑数

设计一个算法,找出只含素因子3,5,7 的第 k 大的数。

符合条件的数如:3,5,7,9,15......

您在真实的面试中是否遇到过这个题?

Yes





样例

如果k=4, 返回 9

挑战

要求时间复杂度为O(nlogn)或者O(n)
标签 Expand   



相关题目 Expand   


解题思路:

解法一:时间复杂度O(k log k),空间复杂度O(k)

使用priority_queue模拟最小堆:   priority_queue, greater > . 从中取出最小的 ugly number , 然后该 ugly number 分别乘以3, 5, 7 然后又放进   priority_queue 中 如果上述过程中,将乘以3,5,7之后的数直接放入   priority_queue   将可能导致重复放入的问题,比如:当取出 9, 然后放入27, 45, 63,。后面当取出 21 时,放入 63, 105, 147,这里就重复放入 63 了。因此需要用个   unordered_set   来 mark 哪些元素已经放入过了。

时间复杂度分析:共 k 个元素,每次取出一个元素时,都需要对堆进行操作,时间复杂度为 O(k),因此时间复杂度为 O(k log k).

解法二:时间复杂度 O(k),空间复杂度O(k)

使用 primes 数组来记录前 k 个ugly_number。在生成 primes 数组时,新增入的元素,肯定是该 primes 数组中前面某些元素乘以3,或是乘以5,或是乘以7的结果,且是最小的
class Solution {
    /**
     * @param k: The number k.
     * @return: The kth prime number as description.
     */
    public long kthPrimeNumber(int k) {
        // write your code here
         long  prime[] = new long[k+1];
         prime[0]  = 1;
         int i3= 0,i5=0,i7=0;
         for(int i=1;i<=k;i++){
              long  nextPrime = getmin(prime[i3]*3, getmin(prime[i5]*5, prime[i7]*7));
              if(nextPrime==prime[i3]*3) i3++;
              if(nextPrime==prime[i5]*5) i5++;
              if(nextPrime==prime[i7]*7) i7++; 
              prime[i] = nextPrime;
         }
         return prime[k];
    }
    public long  getmin(long a,long b){
         return a<b?a:b;
    }
   
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值