263. 编写一个程序判断给定的数是否为丑数。
丑数就是只包含质因数
2, 3, 5
的正整数。示例 1:
输入: 6 输出: true 解释: 6 = 2 × 3
示例 2:
输入: 8 输出: true 解释: 8 = 2 × 2 × 2
示例 3:
输入: 14 输出: false 解释: 14 不是丑数,因为它包含了另外一个质因数7 说明:
1
是丑数。- 输入不会超过 32 位有符号整数的范围: [−231, 231 − 1]。
tips:根据题意,所谓丑数,即该数的因式分解只能由给定的[2,3,5]组成。那么我们可以将其不断除以2/3/5判断是否为1即可,代码如下。
class Solution:
def isUgly(self, num: int) -> bool:
if num<=0:
return False
while num%2==0:
num/=2
while num%3==0:
num/=3
while num%5==0:
num/=5
if num==1:
return True
return False
264. 编写一个程序,找出第
n
个丑数。丑数就是只包含质因数
2, 3, 5
的正整数。示例:
输入: n = 10 输出: 12 解释:1, 2, 3, 4, 5, 6, 8, 9, 10, 12
是前 10 个丑数。
tips: 暴力搜索是不可能的,这辈子都不可能的。我们知道,所有的丑数都是由前边的丑数*2 or *3 or *5得到,我们只需判断用哪一个前列的元素作哪一种乘法即可。此处我们引用三个指针,分别代表当前 *2元素的位置,在此之前的*2得到的值都已经入列丑数数组中;以及当前*3 和*5的位置。最后选取三个指针分别相乘的最小值添加至丑数数组中,对应指针+1。注意有可能出现相等的情况,如2*3==3*2,此时需要将指针+1即可。代码如下:
class Solution:
def nthUglyNumber(self, n: int) -> int:
res=[1]
p1=0;p2=0;p3=0
if n<=0:
return
while n-1:
mini=min(res[p1]*2,res[p2]*3,res[p3]*5)
if mini!=res[-1]:
res.append(mini)
n-=1
if res[-1]==res[p1]*2:
p1+=1
elif res[-1]==res[p2]*3:
p2+=1
else:
p3+=1
return res[-1]
313. 编写一段程序来查找第
n
个超级丑数。超级丑数是指其所有质因数都是长度为
k
的质数列表primes
中的正整数。示例:
输入: n = 12,primes = [2,7,13,19]
输出: 32 解释: 给定长度为 4 的质数列表 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。说明:
1
是任何给定primes
的超级丑数。- 给定
primes
中的数字以升序排列。- 0 <
k
≤ 100, 0 <n
≤ 106, 0 <primes[i]
< 1000 。- 第
n
个超级丑数确保在 32 位有符整数范围内。
该程序与第二个思想一致,代码如下:
class Solution:
def nthSuperUglyNumber(self, n: int, primes: List[int]) -> int:
lenth=len(primes)
p=[0 for _ in range(lenth)]
res=[1]
while n-1:
mini=min([res[p[i]]*primes[i] for i in range(lenth)])
if mini != res[-1]:
res.append(mini)
n-=1
for i in range(lenth):
if mini == res[p[i]]*primes[i]:
p[i]+=1
return res[-1]