Integer Replacement(Leetcode 397)

首先想到 memorized search
最后一個test case是INT_MAX...拿出來單獨討論:

    unordered_map<int, int> mp;
    int integerReplacement(int n) {
        if(n == 1) return 0;
        else if(n == INT_MAX) return 32;
        if(mp.count(n)) return mp[n];
        
        if(n % 2 == 0) {
            mp[n] = integerReplacement(n/2) + 1;
        }else{
            mp[n] = min(integerReplacement(n+1), integerReplacement(n-1)) + 1;
        }
        return mp[n];
    }
};

既然有memorized search,于是便想到用DP試試。但DP難想而且也過不了大數(shù)據(jù)(MLE)。

所以,如果題目滿足以下條件,就用memorized search instead of DP

  1. 數(shù)組會很大(INT_MAX)
  2. 數(shù)組index并不會單調遞增(此題,i取決于i-1, 和i+1),需要未來條件
  3. memorized search更加直觀明確

以下是DP的代碼

class Solution {
public:

    int integerReplacement(int n) {
        if(n <= 1) return 0;
        else if(n == INT_MAX) return 32;
        
        vector<int> dp(n+2, n+2);
        dp[1] = 0, dp[2] = 1;
        for(int i=2; i<n+2; i++){
            if(i % 2 == 0 && dp[i] > dp[i/2] + 1) dp[i] = dp[i/2]+1;
            if(i+1 <= n+1 && dp[i] > dp[i+1] + 1) dp[i] = dp[i+1] + 1;
            if(i % 2 == 0){
                if(i+1 <= n+1) dp[i+1] = min(dp[i+1], dp[i]+1);
                dp[i-1] = min(dp[i-1], dp[i]+1);
            }
        }
        return dp[n];
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容