当前位置:网站首页>【刷题篇】打家劫舍
【刷题篇】打家劫舍
2022-08-02 00:46:00 【m0_60631323】
一、题目
OJ链接
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
示例:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
二、题解
2.1动态规划
本质上求的是在不能取相邻数的情况下的子序列的最大累加和
但本题还有一个特殊限制:
就是数组中的第一个数和最后一个数是算相邻的,也就是说我们不能同时选择第一个数和最后一个数,那么我们可以这样做,分两种情况
1)从0~n-2上做选择
2)从1~n-1上做选择
返回两种情况的较大值
源码:
️
public int rob (int[] nums) {
if(nums.length==1) {
return nums[0];
}
if(nums.length==2) {
return Math.max(nums[0],nums[1]);
}
int N=nums.length;
int[] dp1=new int[N];
dp1[0]=nums[0];
dp1[1]=Math.max(nums[0],nums[1]);
for(int i = 2; i <N-1; i++){
int p1=dp1[i-1];
int p2=dp1[i-2]+nums[i];
dp1[i]=Math.max(p1,p2);
}
int[] dp2=new int[N];
dp2[1]=nums[1];
dp2[2]=nums[2];
for (int i = 3; i <N ; i++) {
int p1=dp2[i-1];
int p2=dp2[i-2]+nums[i];
dp2[i]=Math.max(p1,p2);
}
return Math.max(dp1[N-2],dp2[N-1]);
}
这个代码还是可以继续优化的,因为dp[i]只依赖dp[i-1]和dp[i-2],所以我们就可用几个变量滚动的方式代替dp数组
优化后:
️
public int rob(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
if (nums.length == 2) {
return Math.max(nums[0], nums[1]);
}
int N= nums.length;
int pre1=nums[0];
int pre2=Math.max(nums[0],nums[1]);
for (int i = 2; i < N-1; i++) {
int tmp=Math.max(pre1+nums[i],pre2);
pre1=pre2;
pre2=tmp;
}
int ans1=pre2;
pre1=nums[1];
pre2=Math.max(nums[1],nums[2]);
for (int i = 3; i < N; i++) {
int tmp=Math.max(pre1+nums[i],pre2);
pre1=pre2;
pre2=tmp;
}
int ans2=pre2;
return Math.max(ans1,ans2);
}
边栏推荐
- datagrip 报错 “The specified database userpassword combination is rejected...”的解决方法
- 信息化和数字化的本质区别是什么?
- 【CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)(A~D)】
- 管理基础知识11
- H5页面打开微信小程序
- Redis 相关问题
- 抖音数据接口API-获取用户主页信息-监控直播开启
- CVPR 2022 | SharpContour:一种基于轮廓变形 实现高效准确实例分割的边缘细化方法
- Microsoft PC Manager V2.1 beta version officially released
- flv.js解析与使用
猜你喜欢

IDEA如何运行web程序

ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your

Kubernetes — 核心资源对象 — 存储

go泛型使用方法

MInIO入门-03 秒传+大文件分片上传

go mode tidy出现报错go warning “all“ matched no packages

dbeaver连接MySQL数据库及错误Connection refusedconnect处理

canal realizes mysql data synchronization

Go 1.18 的那些事——工作区、模糊测试、泛型

Flink_CDC搭建及简单使用
随机推荐
期货开户是否有资金门槛?
go笔记——map
管理基础知识13
Can‘t connect to MySQL server on ‘localhost3306‘ (10061) 简洁明了的解决方法
R语言使用cph函数和rcs函数构建限制性立方样条cox回归模型、使用anova函数进行方差分析通过p值确认指定连续变量和风险值HR之间是否存在非线性关系
Moonbeam与Project Galaxy集成,为社区带来全新的用户体验
js中内存泄漏的几种情况
Don't concatenate strings with jOOQ
input禁止输入
简单工厂模式
Two ways to pass feign exceptions: fallbackfactory and global processing Get server-side custom exceptions
ERROR 1064 (42000) You have an error in your SQL syntax; check the manual that corresponds to your
IDEA如何运行web程序
Kubernetes — 核心资源对象 — 存储
Maxwell 一款简单易上手的实时抓取Mysql数据的软件
GO GOPROXY代理设置
如何期货开户和选择期货公司?
hutool工具-----JSON工具-JSONUtil
JS中localStorage和sessionStorage
青蛙跳台阶