House Robber

一道动态规划
我的思路是建一个新容器,将第一个放进去,然后从第三个开始加,加完后再把上一个元素放进去,每次都加容器中的最大值。

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

Runtime: 4 ms, faster than 41.82% of C++ online submissions for House Robber.显然这种方法很慢,因为每一次加的时候都要找一遍最大值。

这种方法直接将最大值放在数组末尾,每次只需比较两个数即可

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

 

posted @ 2019-01-06 00:40  keep!  阅读(201)  评论(0编辑  收藏  举报
Live2D