[264] Ugly Number II
class Solution(object):
def nthUglyNumber(self, n):
"""
:type n: int
:rtype: int
"""
if n<=0:
return 0
if n==1:
return 1
dp=[0 for i in range(n)]
t2=0
t3=0
t5=0
dp[0]=1
for i in range(1,n):
dp[i]=min(2*dp[t2],3*dp[t3],5*dp[t5])
val=dp[i]
if val==2*dp[t2]:
#dp[t2]=val
t2+=1
if val==3*dp[t3]:
#dp[t3]=val
t3+=1
if val==5*dp[t5]:
#dp[t5]=val
t5+=1
return dp[n-1]
313. Super Ugly Number
same idea with ugly number II, use a list to hold the count of all primes
Input: n = 12, primes = [2,7,13,19]
Output: 32
Explanation: [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.
class Solution(object):
def nthSuperUglyNumber(self, n, primes):
"""
:type n: int
:type primes: List[int]
:rtype: int
"""
ret=0
dp=[1 for i in range(n)]
cnt=[0 for i in range(len(primes))]
for i in range(1,n):
dp[i]=min([primes[k]*dp[cnt[k]] for k in range(len(primes))])
for k in range(len(primes)):
if dp[i]==primes[k]*dp[cnt[k]]:
cnt[k]+=1
#break # cannot break, all combination should plus one when equal to the target: like 2*7=14, and also 7*2=14
#print dp
return dp[-1]