Task:
思路:
【解法一:遍历,奇偶分别求和】
思路参考:
首先这个题目,要明白的就是,偷了一间房子,那么与之直接相连接的房子是不能再去偷了,不然就要被抓住完蛋了!
那么就要隔间偷,所以首先想到的就是分为奇偶数进行,但是这样有一个问题:
我们的目标是要偷到的金额最大,那么只偷奇数或者只偷偶数就不能保证是最大的:因为可能有一段是奇数家的钱多,有一段是偶数家的qia多,所以需要找准一个时机。当这一段的最优解没有另外一边好的时候,就把好的那边的复制过来!
代码:
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 0 ) return NULL;
int sumOdd = 0; // 奇数
int sumEven = 0; // 偶数
for (int i=0; i<nums.size(); i++){
if( i % 2 == 0){
sumEven += nums[i];
sumEven = max (sumEven, sumOdd);
}else{
sumOdd += nums[i];
sumOdd = max(sumOdd, sumEven);
}
}
return max(sumEven, sumOdd);
}
};
提交结果:
【解法二:动态规划】
动态规划的不太懂,我都不清楚什么是动态规划,今天大概看一下:
代码:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1)
return nums[0];
if(nums.size()==2)
return max(nums[0],nums[1]);
nums[2]=nums[0]+nums[2];
if(nums.size()==3)
return max(nums[1],nums[2]);
for(int i=3;i<nums.size();i++)
{
nums[i]=max(nums[i-2]+nums[i],nums[i]+nums[i-3]);
}
return max(nums[nums.size()-1],nums[nums.size()-2]);
}
};
提交结果:
可以看出来,基于动态规划的方法,时间复杂度明显要好很多!