Leetcode 198 打家劫舍

题意理解:

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

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

这道题目的含义可理解为: 有一组元素nums=[1,2,3,1]

约束条件时不取相邻的元素,求能获得的最大值

当前状态总是由之前的选择来决定,所以可以考虑动态规划来解决问题。

解题思路:

假设dp[i]表示有i个元素时,所能获取的最大值。

则i=0时,有dp[0]=nums[0]=1

i=1时, 有dp[1]=max(nums[0],nums[1])=max(1,2)=2,即两间屋子选一个价值最高的

i=2时, 没有偷i前一个,当前这个可以偷 dp[i-2]+nums[i]

偷了前一个,则当前这个不能偷 dp[i-1]

则有:

dp[i]=max(dp[i-2]+nums[i],dp[i-1]) i>=2------递推公式

所以该问题是一个动态规划问题

额外注意:dp[i]表示考虑i个屋子能偷到的最大值,不一定偷第i个屋子

1.解决

java 复制代码
public int rob(int[] nums) {
        if(nums.length==0) return 0;
        int[] dp=new int[nums.length];
        Arrays.fill(dp,0);
        dp[0]=nums[0];
        dp[1]=Math.max(nums[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];
    }

2.分析

时间复杂度:O(n)

空间复杂度:O(n)

相关推荐
梯度下降中7 小时前
求职面试中的线代知识总结
人工智能·线性代数·算法·机器学习
SmartBrain8 小时前
OCR 模型在医疗场景的选型研究
人工智能·算法·语言模型·架构·aigc·ocr
梵刹古音8 小时前
【C语言】 跳转语句
c语言·开发语言·算法
liu****8 小时前
29.路径类dp
c++·算法·acm
JMchen1238 小时前
Android计算摄影实战:多帧合成、HDR+与夜景算法深度剖析
android·经验分享·数码相机·算法·移动开发·android-studio
阿猿收手吧!8 小时前
【C++】C++模板特化:精准定制泛型逻辑
开发语言·c++·算法
智驱力人工智能8 小时前
货车走快车道检测 高速公路安全治理的工程实践与价值闭环 高速公路货车占用小客车道抓拍系统 城市快速路货车违规占道AI识别
人工智能·opencv·算法·安全·yolo·目标检测·边缘计算
喵手8 小时前
Python爬虫实战:电商实体消歧完整实战 - 从混乱店铺名到标准化知识库的工程化实现,一文带你搞定!
爬虫·python·算法·爬虫实战·零基础python爬虫教学·同名实体消除·从混乱店铺名到标准化知识库
weixin_452159558 小时前
C++与Java性能对比
开发语言·c++·算法
80530单词突击赢8 小时前
C++哈希表实现:开散列与闭散列详解
算法·哈希算法·散列表