1. 程式人生 > >[leetcode] 650. 2 Keys Keyboard (Medium)

[leetcode] 650. 2 Keys Keyboard (Medium)

解法一:

暴力DFS搜尋,對每一步進行復制還是貼上的狀態進行遍歷。

注意剪枝的地方:

1、當前A數量大於目標數量,停止搜尋

2、當前剪貼簿數字大於等於A數量時,只搜尋下一步為貼上的狀態。

Runtime: 8 ms, faster than 46.69% of C++ online submissions for 2 Keys Keyboard.

class Solution
{
public:
  int targetNum = 0;
  int resNum = INT_MAX;
  int minSteps(int n)
  {
    targetNum = n;
    
if (n == 1) return 0; dfs(1, 1, 1); return resNum; } void dfs(int copy, int curNum, int times) { if (curNum == targetNum) { resNum = min(times, resNum); return; } else if (curNum >= targetNum) return; else if (copy >= curNum) dfs(copy, curNum
+ copy, times + 1); else { dfs(curNum, curNum, times + 1); dfs(copy, curNum + copy, times + 1); } } };

解法二:

當n >= 2的時候,最優策略就是儘可能地生成n的最大因數(n / d)個A,然後進行 Copy 一次 Paste d - 1次操作,

為使n / d儘可能的大,只能使d儘可能的小,於是d從2開始迴圈。當找到一個d之後,我們接下來只需要解決生成n /d個A的問題,所以在迴圈中讓n變為n / d即可。時間複雜度降低到了O(logn)。
Runtime: 0 ms, faster than 100.00% of C++ online submissions for 2 Keys Keyboard.

class Solution
{
public:
  int minSteps(int n)
  {
    int res = 0;
    int d = 2;
    while (n > 1)
    {
      while (n % d == 0)
      {
        res += d;
        n /= d;
      }
      d++;
    }
    return res;
  }
};