LeetCode 198. House Robber

題目大意:
去搶一列房子,但是不能搶相鄰地房子,現在希望搶的價值最多。也就是說在一串數組中找到一個子串,和最大,但是不能不能取兩個連續的數字。
思路:
維護一個數組dpdp,記錄每個位置上及以前的最大值,即dp[i]dp[i]記錄第ii個位置及以前地數字地最大和。由於不能取連續的兩個數字,因此如果要取第ii個位置地數字,則第i1i - 1個位置是不能取的;也可以不取第ii個位置的數字,則可以保留第i1i - 1個位置的值。
這樣在以上兩種情況中取更大值就好了。即max(dp[i2]+nums[i],dp[i1])max(dp[i - 2] + nums[i], dp[i - 1])
還有一個問題,就是數組的長度。存在特殊情況,有可能數組爲空,則最大值就是0;有可能數組就一個數字,則最大值就是這個數字;有可能數組只有兩個數字,最大值就是兩者最大。一般情況用上面的方法就好,特殊情況特判一下就好。
代碼如下,時間複雜度爲O(N)O(N), 空間複雜度O(N)O(N):

class Solution {
public:
    int rob(vector<int>& nums) {
        int dp[10005];
        int length = nums.size();
        if(length == 0){
            return 0;
        }
        if(length == 1){
            return nums[0];
        }
        if(length == 2){
            return max(nums[0], nums[1]);
        }
        if(length > 2){
            dp[0] = nums[0];
            dp[1] = max(nums[0], nums[1]);
            for(int i = 2; i < length; i++){
                dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
                // printf("dp %d\n", dp[i]);
            }
            return dp[length - 1];
        }
        
    }
};

當然可以看到,也就用了dp[i2],dp[i1],dp[i]dp[i - 2], dp[i - 1], dp[i]這幾個數字。因此可以不用存數組,用三個數字就行,減少空間複雜度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章