題目:把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
思路:所有醜數可以通過前面的醜數乘2、3、5得到,主要是要知道如何將這些數從小到大排序,以確定排在第n個位置的醜數。
假設醜數序列是x0,
x1,x
2…xn
x_, x_, x_ … x_
x0,x1
,x2
…xn
, 那麼下乙個醜數一定是min
(xi∗
2,xj
∗3,x
k∗5)
min(x_*2, x_*3, x_*5)
min(xi
∗2,
xj∗
3,xk
∗5)
,那麼i,j
,k
i, j, k
i,j,
k如何求解呢?
醜數序列的最開始x0=
1x_=1
x0=1,i,j
,k
i, j, k
i,j,
k均等於0, min
(xi∗
2,xj
∗3,x
k∗5)
=min
(2,3
,5)=
2min(x_*2, x_*3, x_*5) = min(2, 3, 5) = 2
min(xi
∗2,
xj∗
3,xk
∗5)
=min
(2,3
,5)=
2因此i向右移一位,j、k不變,即
i +=
1i+=1
i+=1
醜數序列變為,
m in
(xi∗
2,xj
∗3,x
k∗5)
=min
(4,3
,5)=
3min(x_*2, x_*3, x_*5) = min(4, 3, 5) = 3
min(xi
∗2,
xj∗
3,xk
∗5)
=min
(4,3
,5)=
3j向右移一位,i、k不變,醜數序列變為,
m in
(xi∗
2,xj
∗3,x
k∗5)
=min
(4,6
,5)=
4min(x_*2, x_*3, x_*5) = min(4, 6, 5) = 4
min(xi
∗2,
xj∗
3,xk
∗5)
=min
(4,6
,5)=
4i向右移一位,j、k不變,醜數序列變為, 如此重複即可得到第n個醜數。
code:
# -*- coding:utf-8 -*-
class solution:
def getuglynumber_solution(self, index):
# write code here
if index == 0:
return 0
result = [1]
index2 = 0
index3 = 0
index5 = 0
for i in range(1, index):
# print(result)
next_chou = min(result[index2]*2, result[index3]*3, result[index5]*5)
if next_chou%2==0:
index2 += 1
if next_chou%3==0:
index3 += 1
if next_chou%5==0:
index5 += 1
return result[-1]
LeetCode刷題 醜數
編寫乙個程式判斷給定的數是否為醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 1 輸入 6 輸出 true 解釋 6 2 3 示例 2 輸入 8 輸出 true 解釋 8 2 2 2 示例 3 輸入 14 輸出 false 解釋 14 不是醜數,因為它包含了另外乙個質因數 7。說明 1 是醜...
LeetCode刷題 醜數
編寫乙個程式判斷給定的數是否為醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 1 輸入 6 輸出 true 解釋 6 2 3 示例 2 輸入 8 輸出 true 解釋 8 2 2 2 示例 3 輸入 14 輸出 false 解釋 14 不是醜數,因為它包含了另外乙個質因數 7。說明 1 是醜...
刷題 醜數提取及醜數判斷
把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。根據醜數的定義,我們知道醜數一定是由2 3 5乘積得到,可表示成如下公式 我們預設1是第乙個醜數,初始醜數序列為1,從1開...