LeetCoda 650 只有兩個鍵的鍵盤

2021-09-12 01:19:18 字數 2016 閱讀 5043

最初在乙個記事本上只有乙個字元 '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 輸出能夠列印出...