最初在乙個記事本上只有乙個字元 'a'。你每次可以對這個記事本進行兩種操作:
copy all
(複製全部) : 你可以複製這個記事本中的所有字元(部分的複製是不允許的)。
paste
(貼上) : 你可以貼上你上一次複製的字元。
給定乙個數字n
。你需要使用最少的操作次數,在記事本中列印出恰好n
個 'a'。輸出能夠列印出n
個 'a' 的最少操作次數。
示例 1:
輸入:3輸出:3解釋:最初, 我們只有乙個字元 'a'。
第 1 步, 我們使用copy all操作。
第 2 步, 我們使用paste操作來獲得 'aa'。
第 3 步, 我們使用paste操作來獲得 'aaa'。
方法:按照題目描述不難推出:
1個a == 0
2個a == 2
3個a == 3
4個a == 4
5個a == 5
6個a == 5
從上面的可以看出,當a的數量是素數時,需要n步
剩下的就好解決了,當a的數量不是素數時,直接使用動態規劃,乙個乙個去試就可以了
class solution:
def minsteps(self, n: int) -> int:
#定乙個列表
step = [i for i in range(n+1)]
step[1] = 0
if n == 1:
return 0
#減少for迴圈的數量
if self.issushu(n):
return n
else:
for i in range(2, n+1):
for j in range(1, i):
if i % j == 0:
step[i] = min(step[i], step[j] + i / j)
return int(step[n])
#判斷n是否為素數
def issushu(self, n):
for i in range(2, int(n / 2) + 1):
if n % i == 0:
return false
return true
這個方法耗時比較大,下面有個大佬寫的,速度比上面的快10倍,借用一下
class solution:
def minsteps(self, n):
if n == 2:
return 2
if n == 1:
return 0
if n > 2 and self.ifsushu(n):
return n
if n > 2 and self.ifsushu(n) == false:
return self.minsteps(self.largestfactor(n)) + int((n / self.largestfactor(n)))
def ifsushu(self, n):
for i in range(2, int(n / 2) + 1):
if n % i == 0:
return false
return true
def largestfactor(self, n):
count = int(n / 2)
while count > 1:
if n % count == 0:
return count
else:
count -= 1
650 只有兩個鍵的鍵盤
最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字n。你需要使用最少的操作次數,在記事本中列印出恰好n個 a 輸出能夠列印出n個 a ...
650 只有兩個鍵的鍵盤
最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字 n 你需要使用最少的操作次數,在記事本中列印出恰好 n 個 a 輸出能夠列印出 n...
leetcode 650 只有兩個鍵的鍵盤
題目描述 最初在乙個記事本上只有乙個字元 a 你每次可以對這個記事本進行兩種操作 copy all 複製全部 你可以複製這個記事本中的所有字元 部分的複製是不允許的 paste 貼上 你可以貼上你上一次複製的字元。給定乙個數字n。你需要使用最少的操作次數,在記事本中列印出恰好n個 a 輸出能夠列印出...