博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA算法:House Robber(JAVA版本解题)
阅读量:4040 次
发布时间:2019-05-24

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

JAVA算法:House Robber(JAVA版本解题)

题目描述:

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1]

输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。
示例 2:

输入: [2,7,9,3,1]

输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
     偷窃到的最高金额 = 2 + 9 + 1 = 12 。

原题链接:LeetCode 198.  House Robber 

算法设计

public static int rob(int[] nums) {        //如果数组的长度小于或者等于1的情况:数组中没有元素,则返回0;数组中只有一个元素时,就返回该元素的值。		if (nums.length <= 1)			return nums.length == 0 ? 0 : nums[0];        //last表示上一次的最大值,初始时将数组中的第一个元素赋值给last		int last = nums[0];		//now表示当前的最大值,初始时要决定是从数组中的第一个元素开始,还是第二个元素开始。		int now = Math.max(nums[1], nums[0]);		for (int i = 2; i < nums.length; i++) {			//把现在的now暂存起来			int tmp = now;			//找到新的now最大值			now = Math.max(last + nums[i], now);			//找到之后,由于有了新的now,那么暂存的now就变成了last			last = tmp;		}		return now;}

完整的测试代码

package com.bean.algorithmexec;public class HouseRobber2 {		public static int rob(int[] nums) {        //如果数组的长度小于或者等于1的情况:数组中没有元素,则返回0;数组中只有一个元素时,就返回该元素的值。		if (nums.length <= 1)			return nums.length == 0 ? 0 : nums[0];        //last表示上一次的最大值,初始时将数组中的第一个元素赋值给last		int last = nums[0];		//now表示当前的最大值,初始时要决定是从数组中的第一个元素开始,还是第二个元素开始。		int now = Math.max(nums[1], nums[0]);		for (int i = 2; i < nums.length; i++) {			//把现在的now暂存起来			int tmp = now;			//找到新的now最大值			now = Math.max(last + nums[i], now);			//找到之后,由于有了新的now,那么暂存的now就变成了last			last = tmp;		}		return now;	}		public static void main(String[] args) {		// TODO Auto-generated method stub		//int[] nums=new int[] {1,2,3,1};		int[] nums=new int[] {1,5,3,8,7,10,1,1,10};		int result=rob(nums);		//int result=rob2(nums);		System.out.println("RESULT = "+result);	}}

程序运行结果:

RESULT = 33

动态规划思路求解

public static int rob2(int[] nums) {	        if (nums==null || nums.length==0)	        {	            return 0;	        }	        if (nums.length==1)	        {	            return nums[0];	        }	        if (nums.length==2)	        {	            return Math.max(nums[0],nums[1]);	        }	        int dp[]=new int[nums.length];	        dp[0]=nums[0];	        dp[1]=Math.max(nums[0],nums[1]);	        for (int i=2;i

程序运行结果:

RESULT = 33

 

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

你可能感兴趣的文章
selenium学习资料
查看>>
<转>文档视图指针互获
查看>>
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
关于进制转换的具体实现代码
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>