LeetCode 动态规划 打家劫舍 II

embedded/2024/12/27 3:47:06/

打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
示例 1:
输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:
输入:nums = [1,2,3,1]
输出:4
解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:
输入:nums = [1,2,3]
输出:3
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 1000

题解

这道题相对于打家劫舍,仅仅是多了一个限制条件

第一个房屋和最后一个房屋是紧挨着

也就是说

第一个房屋和最后一个房屋是不能同时偷的

那么这个条件对于我们分析问题有什么影响嘛

因为我们是不知道对于第一个和最后一个房屋中偷哪一个的

所以不妨分为两种情况

偷第一个,那么最后一个就不能偷,数组的下标范围是 0 到 numsSize-2

偷最后一个,那么第一个就不能偷,数组的下标范围是 1 到 numsSize-1

然后选择这两种情况中的最大值即可

对于这两种情况的计算便与打家劫舍相同了

首先初始化数组前两个的数据

使用两个变量 pre 和 cur 代表 i 位置前两个与前一个的偷得的最大值

然后从下标 2(或3)开始遍历数组

对于下标 i 的数据

它只有偷和不偷这两种选择

如果偷了,它得到的值就是 num[i] + pre

否则就是 cur

选择其中大的结果

然后更新 pre 和 cur

遍历完数组之后

cur 就是能偷到的最大的值

两种情况中最大的cur就是答案

代码如下↓

int rob(int* nums, int numsSize) {if(numsSize==1){return nums[0];}if(numsSize==2){return fmax(nums[0],nums[1]);}int pre1=nums[0];int cur1=nums[0];for(int i=2;i<numsSize-1;i++)//偷第一家{if(nums[i]+pre1>cur1){int x=pre1;pre1=cur1;cur1=nums[i]+x;}else{pre1=cur1;}}int pre2=nums[1];int cur2=fmax(nums[1],nums[2]);for(int i=3;i<numsSize;i++)//不偷第一家{if(nums[i]+pre2>cur2){int x=pre2;pre2=cur2;cur2=nums[i]+x;}else{pre2=cur2;}}return cur1>cur2?cur1:cur2;
}

http://www.ppmy.cn/embedded/143208.html

相关文章

机器学习7_支持向量机_兵王问题

兵王问题描述 用SVM解决问题 国际象棋的规则&#xff1a; 兵&#xff1a;第一次向前可以走一格或两格&#xff0c;以后每次只能向前走一格&#xff0c;不能后退。 王&#xff1a;王被将死即告负。每次只能走一格。 兵王问题&#xff1a; 棋局上&#xff0c;黑方只剩一个王&…

力扣146 LRU缓存 Java版本

文章目录 题目描述代码 题目描述 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存 int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关…

`pnpm` 不是内部或外部命令,也不是可运行的程序或批处理文件(问题已解决,2024/12/3

主打一个有用 只需要加一个环境变量 直接安装NodeJS的情况使用NVM安装NodeJS的情况 本篇博客主要针对第二种情况&#xff0c;第一种也可参考做法&#xff0c;当然眨眼睛建议都换成第二种 默认情况下的解决方法&#xff1a;⭐⭐⭐ 先找到node的位置&#xff0c;默认文件夹名字…

基于STM32设计的智能家居控制系统(华为云IOT)_275

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…

概率论——区间估计

置信区间&#xff1a; 概率分布中&#xff0c;抽出一些样本&#xff0c;通过某种方法&#xff0c;确定一个区间 求解思路&#xff1a; 1、定类型&#xff0c;摆公式 2、计算各分量 3、代入公式 例题&#xff1a; &#xff08;1&#xff09; 1、求μ&#xff0c;方差已知&…

Helm chart 配置、使用简介

helm说明 官方文档&#xff1a;https://helm.sh/zh/docs/helm/helm/ 关于 Helm Chart Helm是Kubernetes生态系统中的一个软件包管理工具&#xff0c;专门负责管理Kubernetes应用资源。而Helm仓库&#xff08;Repository&#xff09;在Helm中扮演着重要角色&#xff0c;是Hel…

初识交换机和路由器

目录 初识交换机和路由器交换机路由器主要区别工作流程如果是交换机&#xff1a;如果是路由器 初识交换机和路由器 左为路由器&#xff0c;右为交换机 交换机 交换机的前身是集线器&#xff0c;集线器是物理层的设备&#xff0c;有很多接口&#xff0c;当一台计算机A想发消息…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的&#xff0c;两个div的高度不一致&#xff0c;而且都是动态高度&#xff0c;有的时候div1高&#xff0c;有的时候div2高&#xff0c;如果设置flex的话&#xff0c;那么就会把较矮的元素撑大&#xff0c;但是我想始终都以div1的高度作为基准&…