博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] House Robber II 打家劫舍之二
阅读量:5825 次
发布时间:2019-06-18

本文共 2978 字,大约阅读时间需要 9 分钟。

 

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [2,3,2]Output: 3Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2),             because they are adjacent houses.

Example 2:

Input: [1,2,3,1]Output: 4Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).             Total amount you can rob = 1 + 3 = 4.

Credits:

Special thanks to for adding this problem and creating all test cases.

 

这道题是之前那道  的拓展,现在房子排成了一个圆圈,则如果抢了第一家,就不能抢最后一家,因为首尾相连了,所以第一家和最后一家只能抢其中的一家,或者都不抢,那我们这里变通一下,如果我们把第一家和最后一家分别去掉,各算一遍能抢的最大值,然后比较两个值取其中较大的一个即为所求。那我们只需参考之前的  中的解题方法,然后调用两边取较大值,代码如下:

 

解法一:

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

 

当然,我们也可以使用两个变量来代替整个DP数组,讲解请参见之前的帖子 ,参见代码如下:

 

解法二:

class Solution {public:    int rob(vector
& nums) { if (nums.size() <= 1) return nums.empty() ? 0 : nums[0]; return max(rob(nums, 0, nums.size() - 1), rob(nums, 1, nums.size())); } int rob(vector
&nums, int left, int right) { int robEven = 0, robOdd = 0; for (int i = left; i < right; ++i) { if (i % 2 == 0) { robEven = max(robEven + nums[i], robOdd); } else { robOdd = max(robEven, robOdd + nums[i]); } } return max(robEven, robOdd); }};

 

另一种更为简洁的写法,讲解请参见之前的帖子 ,参见代码如下:

 

解法三:

class Solution {public:    int rob(vector
& nums) { if (nums.size() <= 1) return nums.empty() ? 0 : nums[0]; return max(rob(nums, 0, nums.size() - 1), rob(nums, 1, nums.size())); } int rob(vector
&nums, int left, int right) { int rob = 0, notRob = 0; for (int i = left; i < right; ++i) { int preRob = rob, preNotRob = notRob; rob = preNotRob + nums[i]; notRob = max(preRob, preNotRob); } return max(rob, notRob); }};

 

类似题目:

 

参考资料:

 

转载地址:http://joidx.baihongyu.com/

你可能感兴趣的文章
Valid Parentheses
查看>>
AIX 配置vncserver
查看>>
windows下Python 3.x图形图像处理库PIL的安装
查看>>
【IL】IL生成exe的方法
查看>>
没有JS的前端:体积更小、速度更快!
查看>>
数据指标/表现度量系统(Performance Measurement System)综述
查看>>
GitHub宣布推出Electron 1.0和Devtron,并将提供无限制的私有代码库
查看>>
论模式在领域驱动设计中的重要性
查看>>
有关GitHub仓库分支的几个问题
查看>>
EAServer 6.1 .NET Client Support
查看>>
锐捷交换机密码恢复(1)
查看>>
Method Swizzling对Method的要求
查看>>
佛祖保佑,永不宕机
查看>>
四、配置开机自动启动Nginx + PHP【LNMP安装 】
查看>>
Linux 目录结构及内容详解
查看>>
OCP读书笔记(24) - 题库(ExamD)
查看>>
.net excel利用NPOI导入oracle
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
hive基本操作与应用
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>