題目大意:
去搶一列房子,但是不能搶相鄰地房子,現在希望搶的價值最多。也就是說在一串數組中找到一個子串,和最大,但是不能不能取兩個連續的數字。
思路:
維護一個數組,記錄每個位置上及以前的最大值,即記錄第個位置及以前地數字地最大和。由於不能取連續的兩個數字,因此如果要取第個位置地數字,則第個位置是不能取的;也可以不取第個位置的數字,則可以保留第個位置的值。
這樣在以上兩種情況中取更大值就好了。即
還有一個問題,就是數組的長度。存在特殊情況,有可能數組爲空,則最大值就是0;有可能數組就一個數字,則最大值就是這個數字;有可能數組只有兩個數字,最大值就是兩者最大。一般情況用上面的方法就好,特殊情況特判一下就好。
代碼如下,時間複雜度爲, 空間複雜度:
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];
}
}
};
當然可以看到,也就用了這幾個數字。因此可以不用存數組,用三個數字就行,減少空間複雜度。