Leetcode ---- 397. 整數替換
阿新 • • 發佈:2018-12-07
題目:
給定一個正整數 n,你可以做如下操作:
1. 如果 n 是偶數,則用 n / 2
替換 n。
2. 如果 n 是奇數,則可以用 n + 1
或n - 1
替換 n。
n 變為 1 所需的最小替換次數是多少?
示例 1:
輸入: 8 輸出: 3 解釋: 8 -> 4 -> 2 -> 1
示例 2:
輸入: 7 輸出: 4 解釋: 7 -> 8 -> 4 -> 2 -> 1 或 7 -> 6 -> 3 -> 2 -> 1
思路:
這道題求最小解,所以考慮用 dfs 做,思路很清晰, 先把問題簡單化:當有一個不被二整除的數字進來時,我們只有兩種選擇,即加一 和 減一,當進來的數能被二整除則繼續除即可。當然,我們還需要一個函數出口,即判斷數的值為 1 ,若是說明一條路徑執行完畢,比較最小值。後面就開始進行回溯,從而求出最小值。
提交時候遇到一個錯誤,就是整數最大值,2147483647。它加一之後溢位了(int),只能減一。有三種方法,一是遇到他直接減一,二是直接返回32,三是將子函式的 int 型轉變為 long long 即可。註釋的為後面看到的別人的方法,可以借鑑一下。
程式:
class Solution { public: int minNum = INT_MAX; int integerReplacement(int n) { // if (n == INT_MAX) return 32; dfs((long long)n,0); return minNum; } void dfs(long long n,int i){ if (n == 1){ if (i < minNum) minNum = i; return; } if (n%2 != 0) dfs(n+1,i+1); if (n%2 != 0) dfs(n-1,i+1); if (n%2 == 0) dfs(n>>1,i+1); } }; /* class Solution { public: int integerReplacement(int n) { if (n == 1) return 0; if (n % 2 == 0) return integerReplacement(n >> 1)+1; int add = integerReplacement((n >> 1) + 1) + 2; int del = integerReplacement(n - 1) + 1; return min(add, del); } }; */