打家劫舍II

题目

Alt

思路

该题相比较上一道题的打家劫舍来说,多了一个限制的条件,就是第一个房屋和最后一个房屋是相连在一起的,那么我们回顾一下上一道题的思路:我们设置一个dp表,dp[i]表示前i个房屋所能获取的最大利益,那么dp[i]=max(dp[i-1],dp[i-2]+nums[i]),如果加上这个限制条件,解题思路又是怎么样的呢?

加上这个限制条件,最直接的说明就是第一家和最后一家不能同时偷,那么如何求[0,n]之间所能获取的最大利益呢?一开始我的思路就是这n家形成了一个环,那么无论从哪里开始,最后他们所能获取的最大利益应该都是相同的,但是没有很好的入手点,想过两次遍历。分别从左往右和从右往左遍历,但是这好像也不能求出最大利益
让我们从已知条件:第一家和最后一家不能同时偷出发,第一家和最后一家不能同时偷意味着:最大利益肯定不可能同时包含第一家的和最后一家,那么范围就缩小到了:最大利益所在的范围只能在(1)包含了第一家而不包含最后一家(2)包含最后一家而不包含第一家,所以最大利益就是res=max([0,n-1],[1,n]),所以我们只需要求出范围在[0,n-1]和范围在[1,n]两者的所能获取的最大利益,然后择二者最大即为答案
相关代码如下:

class Solution {
public:
    int rob(vector<int>& nums) {
        int size = nums.size();
		if (size < 1)
			return 0;
        if(size==1)
            return nums[0];
		//只偷范围内[0,n-1]内的
		int cur1 = 0, pre1 = 0;
		for (int i = 0; i < size - 1; i++) {
			int temp = cur1;
			cur1 = max(cur1, pre1 + nums[i]);
			pre1 = temp;
		}
		//只偷范围[1,n]内的
		int cur2 = 0, pre2 = 0;
		for (int i = 1; i < size; i++) {
			int temp = cur2;
			cur2 = max(cur2, pre2 + nums[i]);
			pre2 = temp;
		}
		return max(cur1, cur2);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值