别再盲目续费!CSDN AI数字营销的“软性上限”已启动:3类高频触发场景+2种扩容优先级通道
2026/6/6 19:36:09
你是一个专业的小偷,计划偷窃沿街的房屋。
每间房都有一定数量的现金,但相邻的房屋装有连通的防盗系统,
如果两间相邻的房屋在同一晚上被闯入,系统会自动报警。
求在不触动警报的前提下,一夜之内能够偷窃到的最高金额。
✅ 动态规划
✅ 线性 DP
✅ 面试高频题
dp[i]=到第 i 间房子为止,能偷到的最大金额对于第i间房子,有两种选择:
| 选择 | 说明 | 金额 |
|---|---|---|
| 不偷 | 继承前一家的最大金额 | dp[i-1] |
| 偷 | 加上前两家的金额 | dp[i-2] + nums[i] |
dp[i]=max(dp[i-1],dp[i-2]+nums[i])| 情况 | 说明 |
|---|---|
| 只有一间房 | 只能偷这一间 |
| 有两间房 | 偷金额较大的那一间 |
dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);classSolution{publicintrob(int[]nums){intlen=nums.length;if(len==1){returnnums[0];}int[]dp=newint[len];dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(inti=2;i<len;i++){dp[i]=Math.max(dp[i-1],// 不偷当前房子dp[i-2]+nums[i]// 偷当前房子);}returndp[len-1];}}| 指标 | 复杂度 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(n)(可优化为 O(1)) |
由于dp[i]只依赖前两个状态:
intprev2=nums[0];intprev1=Math.max(nums[0],nums[1]);for(inti=2;i<nums.length;i++){intcurr=Math.max(prev1,prev2+nums[i]);prev2=prev1;prev1=curr;}returnprev1;要么不偷当前房子,要么偷当前房子 + 前两间的最优解,取最大值。
dp[i-2] + nums[i]而不是dp[i-1] + nums[i]?