House Robber II LeetCode Java
2015-06-24 16:10
591 查看
本博客参考自:https://leetcode.com/discuss/36544/simple-ac-solution-in-java-in-o-n-with-explanation
Note: This is an extension of House Robber.
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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.
这道题目是House Robber的延伸。House Rouber的意思是,一个偷,找到了条街道,然后准备偷钱,这个街道的报警系统比较傻瓜,只要连续两家不同时被偷,就不会报警,求小偷能偷到的最大钱数。
而House Robber II和之前的差别在于,街道编程了一个环,如果你抢了第一家,就不能抢最后一家。
两道题目思路都是使用动态规划。
首先看House Robber。
传统思路:使用数组int[]作为记录数组,int[i] 表示偷到第i家,并且偷第i家的情况,偷到钱最大数。那么有:
money[i]=Max(money[i-2], money[i-3])+nums[i];
但是这样需要额外的O(n)的存储空间,优化后,可使用O(1)空间完成,程序如下(未考虑边界情况):
接下来考虑House Robber II 的问题
考虑这道题目的实际情况,假设有n个住户,那么至少有n/2个用户不被抢。而且任何一个用户要么被抢,要么不被抢。如果第i个用户不被抢,那么可以看做环从第i个位置断开,如果第i个用户被抢,则第i+1个用户一定不被抢,可以看做环从第i+1个位置断开。当然,i是任意的。
所以,可以将House RobberII 转换为 House Robber的问题。
程序如下(这里i和i+1 分别为length-1 和 0):
Note: This is an extension of House Robber.
After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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.
这道题目是House Robber的延伸。House Rouber的意思是,一个偷,找到了条街道,然后准备偷钱,这个街道的报警系统比较傻瓜,只要连续两家不同时被偷,就不会报警,求小偷能偷到的最大钱数。
而House Robber II和之前的差别在于,街道编程了一个环,如果你抢了第一家,就不能抢最后一家。
两道题目思路都是使用动态规划。
首先看House Robber。
传统思路:使用数组int[]作为记录数组,int[i] 表示偷到第i家,并且偷第i家的情况,偷到钱最大数。那么有:
money[i]=Max(money[i-2], money[i-3])+nums[i];
但是这样需要额外的O(n)的存储空间,优化后,可使用O(1)空间完成,程序如下(未考虑边界情况):
private int rob(int[] num) { int include = 0, exclude = 0; for (int j =0; j <nums.length; j++) { int i = include, e = exclude; include = e + num[j]; exclude = Math.max(e, i); } return Math.max(include, exclude); }
接下来考虑House Robber II 的问题
考虑这道题目的实际情况,假设有n个住户,那么至少有n/2个用户不被抢。而且任何一个用户要么被抢,要么不被抢。如果第i个用户不被抢,那么可以看做环从第i个位置断开,如果第i个用户被抢,则第i+1个用户一定不被抢,可以看做环从第i+1个位置断开。当然,i是任意的。
所以,可以将House RobberII 转换为 House Robber的问题。
程序如下(这里i和i+1 分别为length-1 和 0):
public int rob(int[] nums) { if (nums.length == 1) return nums[0]; return Math.max(rob(nums, 0, nums.length - 2), rob(nums, 1, nums.length - 1)); } private int rob(int[] num, int lo, int hi) { int include = 0, exclude = 0; for (int j = lo; j <= hi; j++) { int i = include, e = exclude; include = e + num[j]; exclude = Math.max(e, i); } return Math.max(include, exclude); }
相关文章推荐
- spring mvc/ RESTful
- Ehcache 整合Spring 使用页面、对象缓存
- java join用法
- openfire如何整合spring mvc
- JAVA NIO之浅谈内存映射文件原理与DirectMemory
- Mac下面,eclipse配置jre
- spring mvc(注解)上传文件的简单例子
- Java 类加载、调用构造器、执行方法的过程
- java中几种常见的加密方法
- 浅谈JAVA正则表达式
- spring 注解总结
- myeclipse10新建maven工程
- SSH中各个框架的作用以及Spring AOP,IOC,DI详解
- MyEclipse打包可执行的jar包
- 决策树(信息增益)的java实现
- 64位windows下配置JavaWeb环境
- Ehcache 整合Spring 使用页面、对象缓存
- Struts2 防止重复提交问题
- Java中读取配置文件使用jdbc-c3p0连接池连接sqlserver数据库
- struts2防止表单重复提交的解决方案