leetcode(198)(213) HouseRobber HouseRobber-II

原题链接:

https://leetcode.com/problems/house-robber/

https://leetcode.com/problems/house-robber-ii/

第一题题意是一个贼要偷东西,有n户人家,如果偷相邻两家,就会触发警报。警报一响,警察来抓,逮走(做贼不容易啊)。问怎样在不触发警报而偷走最多的钱。

第二题在第一题基础上有加了个收尾相连,即偷了第一家不能偷最后一家,偷了最后一家不能偷第一家。

很明显用动态规划解题。

之前不了解动态规划的同学,可以先看背包问题九讲!!!,讲的很好,之后我也回把背包问题的代码贴出来。本来想自己写一个系列,想想不重复早轮子了。

背包问题九讲链接地址:http://love-oriented.com/pack/(必看)

第一题:

package leetcode;

public class HouseRobber {

	public static int rob(int[] nums) {
		// https://leetcode.com/problems/house-robber/
		/**
		 * 你是一名专业强盗,计划沿着一条街打家劫舍。 每间房屋都储存有一定数量的金钱,唯一能阻止你打劫的约束条件就是:由于房屋之间有安全系统相连
		 * 如果同一个晚上有两间相邻的房屋被闯入,它们就会自动联络警察,因此不可以打劫相邻的房屋。
		 */
		if (nums == null || nums.length == 0) {
			return 0;
		}
		int len = nums.length;
		int[] max = new int[len];
		max[0] = nums[0];
		for (int i = 1; i < len; i++) {
			if (i <= 1) {
				max[i] = Math.max(nums[i], max[i - 1]);
			} else {
				max[i] = Math.max(max[i - 1], max[i - 2] + nums[i]);
			}
		}
		return max[len - 1];
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums = new int[] { 1, 3, 1 };
		System.out.println(rob(nums) + "");
	}
}
第二题:

因为收尾相邻,所以分两种情况,第一种情况是从第一个到倒数第二家进行第一题的方法进行计算最大值,第二种情况时从第二家到倒数第一家进行第一题的方法进行计算最大值,这样最后一家与第一家就不会同时选到了。最后求两者最大值,就是最终结果了。

package leetcode;

public class HouseRobberII {

	public static int rob(int[] nums) {
		// https://leetcode.com/problems/house-robber-ii/
		if (nums == null || nums.length == 0) {
			return 0;
		}
		int len = nums.length;
		if (len == 1) {
			return nums[0];
		}
		if (len == 2) {
			return Math.max(nums[0], nums[1]);
		}
		int first = robi(nums, 0, len - 2);
		int last = robi(nums, 1, len - 1);
		return Math.max(first, last);
	}

	// HouseRobber1改写
	private static int robi(int[] nums, int start, int end) {
		int len = end - start + 1;
		int[] res = new int[len];
		res[0] = nums[start];

		for (int i = 1; i < len; i++) {
			if (i <= 1) {
				res[i] = Math.max(nums[start+i], res[i - 1]);
			} else {
				res[i] = Math.max(res[i - 2] + nums[start+i], res[i - 1]);
			}
		}
		return res[len - 1];
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] nums = new int[] { 1, 2, 1, 1 };
		System.out.println(rob(nums) + "");
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值