本文介绍: 【代码】198. 打家劫舍。
198. 打家劫舍
原题链接:
https://leetcode.cn/problems/house-robber/description/
完成情况:
参考代码:
_198打家劫舍
package 代码随想录.动态规划;
public class _198打家劫舍 {
/**
*
* @param nums
* @return
*/
public int rob(int[] nums) {
// TODO 每次偷窃后,必须至少冷却一天,问多大头去数量数多少
if(nums == null || nums.length == 0){
return 0;
}
if (nums.length == 1) {
return nums[0];
}
//有多个时,才需要使用到dp
int [] dp = new int[nums.length];
//模拟出取每一个长度位置时的最大累计和
dp[0] = nums[0];
dp[1] = Math.max(dp[0],nums[1]);
for (int i=2;i< nums.length;i++){
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.length - 1];
}
}
_198打家劫舍_滚动优化
package 代码随想录.动态规划;
public class _198打家劫舍_滚动优化 {
/**
* 进一步对滚动数组的空间优化 dp数组只存与计算相关的两次数据
* @param nums
* @return
*/
public int rob(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
//初始化dp数组
//优化空间,dp数组只用2个空间,只记录与当前计算相关的前两个结果
int [] dp = new int[2];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
int res = 0;
//遍历
for (int i=2;i< nums.length;i++){
res = Math.max((dp[0] + nums[i]),dp[1]);
dp[0] = dp[1];
dp[1] = res;
}
//输出结果
return dp[1];
}
}
_198打家劫舍_滚动数组
package 代码随想录.动态规划;
public class _198打家劫舍_滚动数组 {
/**
* 分析本题可以发现,所求结果仅依赖于前两种状态,此时可以使用滚动数组思想将空间复杂度降低为3个空间
* @param nums
* @return
*/
public int rob(int[] nums) {
int len = nums.length;
if (len == 0){
return 0;
} else if (len == 1) {
return nums[0];
}else if (len == 2){
return Math.max(nums[0],nums[1]);
}
//如果存在多个时。每次只看目之所及的三个
int result [] = new int[3]; //用来存放选择的结果
result[0] = nums[0];
result[1] = Math.max(nums[0],nums[1]);
//迭代遍历完整个数组
for (int i=2;i< len;i++){
result[2] = Math.max(result[0]+nums[i],result[1]);
result[0] = result[1];
result[1] = result[2];
}
return result[2];
}
}
错误经验吸取
原文地址:https://blog.csdn.net/weixin_43554580/article/details/135705823
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_60442.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。