后端开发刷题 | 打家劫舍

描述

你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家;如果偷了第二家,那么就不能偷第一家和第三家。

给定一个整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。

数据范围:数组长度满足 1≤n≤2×105,数组中每个值满足 1≤num[i]≤5000

示例1

输入:

复制代码
[1,2,3,4]

返回值:

复制代码
6

说明:

复制代码
最优方案是偷第 2,4 个房间   

示例2

输入:

复制代码
[1,3,6]

返回值:

复制代码
7

说明:

复制代码
最优方案是偷第 1,3个房间   

示例3

输入:

复制代码
[2,10,5]

返回值:

复制代码
10

说明:

复制代码
最优方案是偷第 2 个房间  

思路分析:

该题使用动态规划来解决,

具体做法:

  • step 1:用dp[i]表示长度为i的数组,最多能偷取到多少钱,只要每次转移状态逐渐累加就可以得到整个数组能偷取的钱。
  • step 2:(初始状态) 如果数组长度为1,只有一家人,肯定是把这家人偷了,收益最大,因此dp[1]=nums[0]。
  • step 3:(状态转移) 每次对于一个人家,我们选择偷他或者不偷他,如果我们选择偷那么前一家必定不能偷,因此累加的上上级的最多收益,同理如果选择不偷他,那我们最多可以累加上一级的收益。因此转移方程为dp[i]=max(dp[i−1],nums[i−1]+dp[i−2])。这里的i在dp中为数组长度,在nums中为下标。

图示:

代码:

java 复制代码
import java.util.*;


public class Solution {
    /**
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int rob (int[] nums) {
        int[] dp=new int[nums.length+1];
        dp[1]=nums[0];
        for(int i=2;i<=nums.length;i++){
            dp[i]=Math.max(dp[i-1],nums[i-1]+dp[i-2]);
        }
        return dp[nums.length];
    }
}
相关推荐
罗西的思考39 分钟前
【GUI-Agent】阿里通义MAI-UI 代码阅读(2)--- 实现
人工智能·算法·机器学习
流年如夢42 分钟前
单链表进阶版 -->双向链表
数据结构·链表
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
通过java后端代码来实现给word内容补充格式文本内容控件,以及 设置控件的标记和标题
java·c#·word
刀法如飞2 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
無限進步D2 小时前
Java 面向对象高级 接口
java·开发语言
流年如夢2 小时前
单链表 -->增、删、查、改等详细操作
c语言·数据结构
逸Y 仙X2 小时前
文章二十七:ElasticSearch ES查询模板(Search Template)高效复用实战
java·大数据·数据库·elasticsearch·搜索引擎·全文检索
二哈赛车手3 小时前
新人笔记---Spring AI的Advisor以及其底层机制讲解(涉及源码),包含一些遇见的Spring AI的Advisor缺陷问题的解决方案
java·人工智能·spring boot·笔记·spring
sali-tec3 小时前
C# 基于OpenCv的视觉工作流-章66-直线夹角
图像处理·人工智能·opencv·算法·计算机视觉