1. 程式人生 > >Leetcode ---- 397. 整數替換

Leetcode ---- 397. 整數替換

題目:

給定一個正整數 n,你可以做如下操作:

1. 如果 是偶數,則用 n / 2替換 n
2. 如果 是奇數,則可以用 n + 1n - 1替換 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);
	}
};
*/