[leetcode] 650. 2 Keys Keyboard (Medium)
阿新 • • 發佈:2018-11-27
解法一:
暴力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; } };