天天看點

LeetCode-650. 隻有兩個鍵的鍵盤

最初在一個記事本上隻有一個字元 'A'。你每次可以對這個記事本進行兩種操作:

  1. Copy All

     (複制全部) : 你可以複制這個記事本中的所有字元(部分的複制是不允許的)。
  2. Paste

     (粘貼) : 你可以粘貼你上一次複制的字元。

給定一個數字 

n

 。你需要使用最少的操作次數,在記事本中列印出恰好 

n

 個 'A'。輸出能夠列印出 

n

 個 'A' 的最少操作次數。

示例 1:

輸入: 3
輸出: 3
解釋:
最初, 我們隻有一個字元 'A'。
第 1 步, 我們使用 Copy All 操作。
第 2 步, 我們使用 Paste 操作來獲得 'AA'。
第 3 步, 我們使用 Paste 操作來獲得 'AAA'。
           

說明:

  1. n

     的取值範圍是 [1, 1000] 。

很明顯應該是一道遞歸的題

我的想法是如果n==1自然傳回0,如果n是2的倍數就遞歸 f(n/2)+2,如果都不是的話就周遊它的約數

按照先找湊出那個約數最少的步數再加上n/約數,後者表示粘貼約數和複制的總次數

solution:

class Solution {
    public int minSteps(int n) {
        if(n==1)
            return 0;
        else if(n%2==0)
            return minSteps(n/2)+2;
        else{
            int num = Integer.MAX_VALUE;
            for(int i=1;i<=n/2;i++){
                if(n%i==0){
                    num = Math.min(num,minSteps(i)+n/i);
                }
            }
            return num;
        }
    }
}