Ugly Number
Question
Ugly number is a number that only have factors 3, 5 and 7.
Design an algorithm to find the Kth ugly number. The first 5 ugly numbers are 3, 5, 7, 9, 15
...
Thoughts
这一题跟之前的ugly number不太一样,只有3,5,7, 之前的题是说prime factor只有2,3,5
分析:假设数组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个丑数产生。
总之:每次竞争中有一个(也可能是两个)因子胜出,下一次竞争中 胜出的因子就应该加大惩罚!
我的理解是,每次的值肯定是从之前的数中得出,但是3,5,7所用的数不一样,所以要有三个pointer,然后在上一次比较中最小的数因为对于这个乘数已经用过了,所以应该跳过,指向下一个数
Analysis
Solution
class Solution:
"""
@param k: The number k.
@return: The kth prime number as description.
"""
def kthPrimeNumber(self, k):
# write your code here
if not k:
return None
indexThree = 0
indexFive = 0
indexSeven = 0
result = []
result.append(1)
for i in range(1, k + 1):
newNum = min(result[indexThree] * 3, result[indexFive] * 5, result[indexSeven] * 7)
result.append(newNum)
if newNum / result[indexThree] == 3:
indexThree += 1
if newNum / result[indexFive] == 5:
indexFive += 1
if newNum / result[indexSeven] == 7:
indexSeven += 1
return result[k]