CSDN话题挑战赛第2期
参赛话题:算法题解
丑数专题
四道 丑数题目 千万不要被迷惑哦!
263. 丑数
题目链接:263. 丑数
题目大意:丑数 就是只包含质因数 2、3 和 5 的正整数。
给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false
例如:
输入:n = 6
输出:true
解释:6 = 2 × 3
输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。
解题思路: 循环 求余 整除
class Solution:
def isUgly(self, n: int) -> bool:
if n<1: return False
factor = [2,3,5]
for i in factor:
# Be sober!
while n % i == 0:
n //= i
if n == 1: return True
return False
264. 丑数 II
题目链接:264. 丑数 II
题目大意:给你一个整数 n ,请你找出并返回第 n 个 丑数 。丑数 就是只包含质因数 2、3 和/或 5 的正整数
例如:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
输入:n = 1
输出:1
解释:1 通常被视为丑数。
解题思路: 动态规划 三个指针。
- 同类型题目: 面试题 17.09. 第 k 个数 与 剑指 Offer 49. 丑数
class Solution:
def nthUglyNumber(self, n: int) -> int:
if n<7: return n
dp = [1]
p2 = p3 = p5 = 0
for i in range(2,n+1):
newNum = min(dp[p2]*2,dp[p3]*3,dp[p5]*5)
dp.append(newNum)
if newNum == dp[p2]*2: p2 += 1
if newNum == dp[p3]*3: p3 += 1
if newNum == dp[p5]*5: p5 += 1
return dp[-1]
1201. 丑数 III
题目链接:1201. 丑数 III
题目大意:给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。
丑数是可以被 a 或 b 或 c 整除的 正整数 。
例如:
输入:n = 3, a = 2, b = 3, c = 5
输出:4
解释:丑数序列为 2, 3, 4, 5, 6, 8, 9, 10... 其中第 3 个是 4。
输入:n = 5, a = 2, b = 11, c = 13
输出:10
解释:丑数序列为 2, 4, 6, 8, 10, 11, 12, 13... 其中第 5 个是 10。
解题思路: 二分法做题 不要被迷惑哦!
class Solution:
def nthUglyNumber(self, n: int, a: int, b: int, c: int) -> int:
# 真 tm 坑啊! 二分法
# 2 or 3 or 5
# ab = lcm(a,b)
ab,ac,bc = lcm(a,b),lcm(a,c),lcm(b,c)
abc = lcm(ab,c)
def check(k: int) -> bool:
return k//a+k//b+k//c-(k//ab+k//ac+k//bc)+k//abc < n
L,R = 1,2*10**9
while L < R:
mid = L + (R-L)//2
if check(mid):
L = mid+1
else:
R = mid
return L
总结
丑数这类型的题目 提供有趣,在此记录一下,便于后续复习。