打家劫舍(动态规划)求数组所有非相邻数字的最大和

php 移除数组重复元素的一点说明 PHP中移除数组重复元素用的函数是array_unique 立即下载

题目讲解

题目源于Leetcode练习

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

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

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

提示:

0 <= nums.length <= 100
0 <= nums[i] <= 400

思路讲解

Best[ i ]: 表示表示抢劫第1号房到第i号房钱财和的最佳收益
num[ i-1 ] :表示 第 i 号房子拥有的钱财(注:nums数组索引从0开始)

则很容易知道 Best[i]只有两种可能:

  • 第一种可能: 抢第i-2号房之前的最佳收益加上抢第i号房的收益
  • 第二种可能, 抢第i-1号房及之前房的最佳收益 (此时抢了第i-1号房就不能抢第i号房了)

这就是动态规划(Dynamic Programming DP)的思想,想要得到后面的最优解,则需要依靠前面的最优解。
了解了这个思想之后便可以开始编程了;

方法1:

class Solution {
    public int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int[] Best=new int[nums.length+1];   //Best[ i ] 表示抢劫第1号房到第i号房钱财和的最佳收益
        Best[0]=0;
        Best[1]=nums[0];  //初始化,抢劫第1号房及之前房的收益和肯定只有1号房的钱财
        for (int i = 2; i <=nums.length ; i++) {
            // 依次递推, Best[i]只有两种可能
            // 第一种可能: 抢第i-2号房之前的最佳收益加上抢第i号房的收益, 注意:第i号房在nums数组中的索引是i-1
            // 第二种可能, 抢第i-1号房及之前房的最佳收益  (此时抢了第i-1号房就不能抢第i号房了)
            Best[i]=Math.max(Best[i-2]+nums[i-1],Best[i-1]);
        }
        return Best[nums.length];
    }
}  

此时这种方法的时间复杂度与空间复杂度都是O(n) ,由于只需要Best[nums.length],所以之前的最优解都无需保存,可以利用滚动数组改进空间复杂度,见方法二。

方法二

利用S1记录:抢第i-2号房之前的最佳收益加上抢第i号房的收益。
S2记录:抢第i-1号房及之前房的最佳收益 (此时抢了第i-1号房就不能抢第i号房了)

若将新一轮递推的S1,S2 表示为S1’ , S2’
则有 S1’=S2,
S2’ = max( S2, S1+nums[i] )

在这里插入图片描述则正式代码为:

class Solution2 {
    public int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        int S1=0;
        int S2=nums[0];
        int temp;
        for (int i = 1; i <nums.length ; i++) {
            // 依次递推, Best[i]只有两种可能
            // S1: 抢第i-2号房之前的最佳收益加上抢第i号房的收益, 注意:第i号房在nums数组中的索引是i-1
            // S2, 抢第i-1号房及之前房的最佳收益  (此时抢了第i-1号房就不能抢第i号房了)
            temp=S2;
            S2=Math.max(S1+nums[i],S2);
            S1=temp;
        }
        return S2;
    }
}

此时时间复杂度仍然为O(n),但是空间复杂度变成了O(1)。

时间复杂度与空间复杂度是考察算法是否优秀的重要准则! 尽管在此处运行难以看出区别,但是在大型项目中,可以根本性的改变! 所以需要时时有改进复杂度的思想,需要重视!

【编译原理】LL(1)分析方法 生成语法树(c++实现) 基本流程 输入文法->消除左递归->提取左公共因子->求FIRST集->求FOLLOW集->LL(1)分析表->表驱动的预测语法分析过程->输出语法分析结果和语法树 阅读详情

相关推荐

别再踩坑了!CAPL脚本里局部变量和全局变量的那些“怪事”(附CANoe实测代码)

本文深度解析CAPL脚本中局部变量和全局变量的特殊机制,揭示其与通用编程语言的差异。通过实测代码展示静态局部变量的默认行为和全局变量的节点隔离特性,并提供高效避坑指南,帮助汽车网络测试工程师避免常见陷阱。

weixin_30225755的博客 292

求数组中不相邻的数和的最大值

题目:求数组中不相邻的数和的最大值。 例如:1,3,5,2,6 最大值是:5+6=11 #include <stdio.h> int a[5] = {1,3,5,2,6}; int max(int x,int y) { return x>y?x:y; } int main() { int i; int sum[5] = {0}; sum[0]=0; sum[1]=1; for.

4075

STM32踩坑--NoST-LINK detected

这里出现的NoST-LINK detected是没有扫描到端口 在我使用一段Fly-MCU后,有一天突然发现出现如上错误,再检查的过程中检查以下几点 1.STM32 魔术棒的设置 1.1Debug设置 1.2 utilities 设置没有问题,与原来一样又看了下端口——在设备管理器中;也没有问题 ...

qq_53002477的博客 2万+

从一组数字中选出非相邻数字和的最大值

问题描述:给定一组数字,要求从这组数字里找出非 相邻数字和的最大值。 举例: 输入:4 1 1 9 1 输出:13(9+4) 输入:1 2 4 1 7 8 3 输出:13 (8+4+1) 代码实现: public class Demo { //递归实现 public static int rec_opt(int[] arr, int i) { if (i == 0) return arr[0]; else if (i == 1) return arr[0] &gt

RuiHao-He的博客 888

深度学习CV八股文

深度学习CV八股文一、深度学习中解决过拟合方法L1和L2正则化DropoutDropout正则化Inverted Dropout(反向随机失活)Dropout起到正则化效果的原因:Dropout的缺点eargstopping ( 早停法 )二、深度学习中解决欠拟合方法三、梯度消失和梯度爆炸解决梯度消失的方法解决梯度爆炸的方法四、神经网络权重初始化方法Xavier指数加权移动平均数五、梯度下降法梯度下降SGD(随机梯度下降法)Momentum(动量梯度下降)Nesterov Momentum自适应学习率算法A

填坑 2万+

Ubuntu升级遇到grub-efi-amd64-signed安装失败?3步搞定这个烦人错误

本文深度解析Ubuntu系统升级时grub-efi-amd64-signed安装失败并提示“cannot find EFI directory”错误的根本原因。该错误通常由EFI系统分区挂载异常、BIOS/UEFI引导模式不匹配或dpkg包状态死锁导致。文章提供了三步精准修复流程:首先检查并修复ESP分区挂载,其次处理dpkg依赖问题,最后针对传统BIOS系统提供适配方案,帮助用户安全彻底地解决这一常见升级难题。

r7s8t的博客 398

求一个数组中非相邻元素和的最大值问题(动态规划)

求一个数组中非相邻元素和的最大值问题 视频地址 1.递归版本 public class Test { public static int rec_opt(int[] arr, int len) { if(len==0) return arr[0]; else if(len==1) return Math.max(arr[0], arr[1]); else return Math.max(rec_opt(arr, len-2)+arr[len], rec_opt(arr,

lnshmpu的博客 1363

深入解析SAP F4帮助函数F4IF_INT_TABLE_VALUE_REQUEST的回调机制

本文深入解析了SAP ABAP开发中F4IF_INT_TABLE_VALUE_REQUEST函数的回调机制。通过剖析其工作原理与核心参数,详细阐述了如何利用回调函数实现F4帮助的多值返回、动态数据过滤及选择后校验等高级定制功能,并提供了实用的代码示例与调试技巧,帮助开发者高效应对复杂的屏幕交互需求。

weixin_29213827的博客 198

打家劫舍、斐波那契数、整数拆分(动态规划)

看视频总结的·动态规划的基本步骤: 1.dp数组的定义和下标。 2.递推公式。 3.dp数组如何初始化,初始化也需要注意。 4.确定遍历顺序,比较考究.。 5.举例推导dp数组。 用简单的题目来加深对以上方法的理解。 斐波那契数 斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1给你 n .

qq_49425839的博客 493

什么是 AI Agent?它和直接调用大模型 API 有什么区别?

什么是 AI Agent?它和直接调用大模型 API 有什么区别?

我哎GIS博客 6477

TC3XX - MCAL知识点(三十三):基于EB Tresos配置Tc3xx的MCAL代码如何产生中心对称的三相六路发波波形

本文用于记录如何在英飞凌 tc3xx 芯片的应用开发中,借助 EB Tresos 配置工具生成的配置代码与 MCAL 源码相结合,进而实现三相六路中心对称互补的 PWM 输出效果。外部资源需求:EB Tresos23.0以上、Tasking\Hightec编译器、示波器\逻辑分析仪。

梦想技术家 1209

动态规划_打家劫舍(Ⅰ~Ⅲ)

打家劫舍系列198. 打家劫舍打家劫舍的dp递推公式比较容易找到难的是边界情况判断以及跟树结合时需要使用备忘录。

qq_73731671的博客 1479

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

FPGA 学习笔记:Vitis IDE launch failed 的解决方法

坚韧与专注 1万+

【动态规划】(四)动态规划——打家劫舍与买卖股票

整理总结动态规划中的打家窃舍和各种不同的股票买卖问题

weixin_46216674的博客 744

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

leetcode之路(198.打家劫舍 and 213.打家劫舍ii)

leetcode之路(198.打家劫舍 and 213.打家劫舍ii) 题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [1,2,...

qq_44525150的博客 409

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【算法-动态规划】打家劫舍专题

动态规划之打家劫舍

Ape's IT Blog 621

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

牛客题解 | 不相邻取数

牛客题库题解

wc529065的博客 482

【动态规划】打家劫舍(I、II)

目录1.打家劫舍I(中等)1.1题目1.2分析1.3代码(C++)2.打家劫舍II(中等)2.1题目2.2分析2.3代码(C++) 1.打家劫舍I(中等) 1.1题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 示例 1: 输入:[1,2,3,1] 输出:4

taoxing 375

删除相邻数字的最大分数(打家劫舍)

摘要:本题类似"打家劫舍"问题,通过预处理将数组元素转换为sum数组(sum[i]表示值为i的元素总和)。使用动态规划求解,状态转移方程为dp[i] = max(dp[i-1], dp[i-2]+sum[i]),确保不选取相邻元素的情况下获得最大分数。最终结果存储在dp[10001]中。时间复杂度为O(n),空间复杂度为O(1)。

w_z_j 140

查找给定数组的非相邻元素子集的和的最大值

打家劫舍问题:只能抢非相邻家庭,数组中的值表示的是到每家可以抢到的财产数量,动态规划求出最大抢劫数量。 好难想,��呐,感觉要秃顶了。拥有这种思路的人真的是思路灵活的天才呐。 int rob(vector&lt;int&gt;&amp; nums){ int length = nums.size(); if(!length) return 0; ...

mixiaoxinmiss的博客 551

力扣——打家劫舍 从问题出发了解动态规划

动态规划是算法部分最常见的方法之一,很多问题都可以用动态规划去解决或管理。而如何使用动态规划就成为了新手程序员进阶略有经验的程序员的一道门槛。 对于动态规划来说,他不是一种简单的方法或者一种函数,而是一种思想。举例来说,动态规划可以简单地理解为两个步骤: 1:**研究明白最后一个问题有哪些情况可以达到**。 2:**向前推导,直到推导到第一步,研究明白第一或者几个简单已知项如何构成后面的情况**。 我们来看一个经典问题 **打家劫舍**: 你是一个专业的小偷,计划偷窃沿街的房.

qq_52986162的博客 413

LeetCode 192 打家劫舍 (中等 动态规划)

打家劫舍 1.题目 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 示例1: 输入: [1, 2, 3, 1] 输出:4 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。 示例 2:

hgp0487561的博客 277

leetcode打家劫舍1,2,3(dp+递归)

leetcode打家劫舍1 题意:给定一个数组,相邻的数字不能相加,其余数字可以任意相加,问在次情况下最大和是多少 思路:理解题意后就能明白这道题的和最大和是个动态增长的过程而且依赖之前求出来的最大和,我们可以用dp来解决。 dp的动态方程为dp[i] = max(dp[i-2]+nums[i],dp[i-1]) 代码如下: public int rob(int[] nums) { ...

is Mr.Chen的博客 629

每日一道笔试题之删除相邻数字的最大分数

以上就是今天的每日一题,如果大家还有更有趣的笔试题,更精妙的解法,欢迎交流,博主也在持续进化!!!!

2301_80343607的博客 314

动态规划问题-删除并获得点数(Java实现)

动态规划打家劫舍的变型题目

m0_52238102的博客 438

动态规划——139单词拆分,152乘积最大子数组,198打家劫舍

139. 单词拆分 给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。 说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词。 示例 1: 输入: s = “leetcode”, wordDict = [“leet”, “code”] 输出: true 解释: 返回 true 因为 “leetcode” 可以被拆分成 “leet code”。 示例 2: 输入: s = “applepenapple”, w

qq_39457296的博客 396
上一篇: 实现 Trie (前缀树),或者说字典树(单词查找树)
下一篇: LinkedList中add,addLast,offer,pollLast,removeLast等区别
老邓CODING
博客等级 码龄8年 9粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值