Leetcode-196 打家劫舍

心路历程

最开始觉得反正都有钱,那就奇数路走一遍,偶数路走一遍,发现实在是太蠢。
[2,1,1,2] 这种测试样例教育做人。
后来开始把问题复杂化,出了第一版代码。


代码

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]);
      vector<int> book(nums.size(),0);
      book[0]=nums[0];
      book[1]=nums[1];
      int temp;
      for(int i=2;i<nums.size();i++)
      {
        temp=book[i-1];
        for(int j=i-2;j>=0;j--)
            temp=max(temp,book[j]+nums[i]);
        book[i]=temp;
      }
     return book[nums.size()-1];
    }
};

看了题解以后发现,其实没必要一直倒回去到0。
你主要每个都遵循规律如果想要选择num[i],你的可选范围就要从0~i-2 这个数组范围内寻找,无需在意dp[i-1]这个值中,nums[i-1]是否被选择了,因为给你的已经是 0~i-1 范围内最好的了。
状态转移方程 dp[i]=max(dp[i-1],dp[i-2]+nums[i]);

class Solution {
public:
    int rob(vector<int>& nums) {
      if(nums.size()<=0) return 0;
      if(nums.size()==1) return nums[0];
      vector<int> book(nums.size(),0);
      book[0]=nums[0];
      book[1]=max(nums[0],nums[1]);
      for(int i=2;i<nums.size();i++)
      {
        book[i]=max(book[i-1],book[i-2]+nums[i]);
      }
     return book[nums.size()-1];
    }
};

Leetcode-196 打家劫舍_第1张图片

始终要注意[] [0] 这类边界测试样例,谨记。

你可能感兴趣的:(Leetcode)