LeetCode算法题-House Robber(Java实现)

5G NR上行调度核心:手把手拆解BSR流程中的三个定时器(retxBSR/periodicBSR/logicalChannelSR-Delay) 本文深入解析5G NR上行调度中BSR流程的三大核心定时器——retxBSR-Timer、periodicBSR-Timer和logicalChannelSR-DelayTimer,揭示其在资源分配、时延控制和信令开销中的关键作用。通过详细的技术规范解读、配置优化策略及实战案例分析,帮助工程师掌握定时器协同机制,提升上行调度效率,适用于URLLC、eMBB等多样化5G场景。 阅读详情

这是悦乐书的第187次更新,第189篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第46题(顺位题号是198)。你是一个专业的强盗,计划在街上抢劫房屋。 每个房子都藏着一定数量的钱,阻止你抢劫他们的唯一限制因素是相邻的房屋有连接的安全系统,如果两个相邻的房子在同一个晚上被闯入,它将自动联系警方。给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最大金额而不警告警察。例如:

输入:[1,2,3,1]
输出:4
说明:Rob house 1(money = 1)然后抢房子3(钱= 3)。您可以抢夺的总金额= 1 + 3 = 4。

输入:[2,7,9,3,1]
输出:12
说明:Rob house 1(money = 2),rob house 3(money = 9)和rob house 5(money = 1)。您可以抢夺的总金额= 2 + 9 + 1 = 12。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

初始思路是偶数、奇数下标的元素分别求和,然后判断其中的最大值,但是有个问题,此思路只考虑了隔一个元素,那要是隔两个、三个甚至更多呢?在每次算完奇数或者偶数下标元素之和之后,还要和已有的偶数下标元素和或者奇数下标元素和做最大值判断,最后再取偶数下标元素和、奇数下标元素和中的最大值。

特殊情况:当数组为null或者数组中没有任何元素时,直接返回0。

public int rob(int[] nums) {
    if (nums == null || nums.length == 0) {
        return 0;
    }
    int sum = 0;
    int sum2 = 0;
    for(int i=0; i<nums.length; i++){
        if (i%2 == 0) {
            sum = Math.max(sum+nums[i], sum2);
        } else {
            sum2 = Math.max(sum2+nums[i], sum);
        }
    }
    return Math.max(sum, sum2);
}

此解法的时间复杂度是O(n),空间复杂度是O(1)。

03 第二种解法

使用动态规划算法。

第一步,我们找到此问题的递归关系,强盗有两种选择:

a)抢劫当前的房子i

b)不抢劫当前的房子i

如果选择选项“a”,则意味着无法抢夺之前的i-1房屋,但可以安全地前往前一个i-2之前的房屋并获得随后的所有累积战利品。

如果选择了一个选项“b”,强盗将从抢劫i-1和剩下所有建筑物中获得所有可能的战利品。

因此,利益最大的结果就有两种可能:

1)抢劫当前房屋 + 前一次房屋抢劫

2)从之前的房屋抢劫和之前捕获的任何战利品中掠夺

对此,可以得出以下公式:

rob(i) = Math.max( rob(i-2) + currentHouseValue, rob(i-1) )

第二步,在分析出了递归关系后,我们可以得到自顶向下的递归解法,对此,我们可以写出第一版的代码:

public int rob(int[] nums) {
    return rob(nums, nums.length-1);
}
private int rob(int[] nums, int i) {
    if (i < 0) {
        return 0;
    }
    return Math.max(rob(nums, i-2) + nums[i], rob(nums, i-1));
}

第三步,上面的递归算法,会造成大量的重复计算,对此可以使用备忘录算法来记录前一步的值,同样是使用自顶向下的递归算法。

public int rob(int[] nums) {
    int[] memo = new int[nums.length + 1];
    Arrays.fill(memo, -1);
    return rob(nums, nums.length - 1);
}

private int rob(int[] nums, int i) {
    if (i < 0) {
        return 0;
    }
    if (memo[i] >= 0) {
        return memo[i];
    }
    int result = Math.max(rob(nums, i-2) + nums[i], rob(nums, i-1));
    memo[i] = result;
    return result;
}

Arrays.fill(memo, -1)方法表示memo数组的元素全部由-1来填充。

第四步,备忘录算法不变,可以将递归算法用迭代替代,变成自底向上的方式。

public int rob(int[] nums) {
    if (nums.length == 0) return 0;
    int[] memo = new int[nums.length + 1];
    memo[0] = 0;
    memo[1] = nums[0];
    for (int i = 1; i < nums.length; i++) {
        int val = nums[i];
        memo[i+1] = Math.max(memo[i], memo[i-1] + val);
    }
    return memo[nums.length];
}

第五步,可以注意到,在上一步中我们只使用memo[i]和memo[i-1],所以只需要两步。我们可以将它们保存在2个变量中,而不必使用备忘录算法。

public int rob(int[] nums) {
    if (nums.length == 0) return 0;
    int prev1 = 0;
    int prev2 = 0;
    for (int num : nums) {
        int tmp = prev1;
        prev1 = Math.max(prev2 + num, prev1);
        prev2 = tmp;
    }
    return prev1;
}

上述解法的思路参考至@heroes3001的说明,写的很好,就按照自己的理解翻译了下,按照这五个步骤基本可以解决类似的动态规划算法问题。最下方的原文链接就是该作者原答案。

04 小结

算法专题目前已连续日更超过一个月,算法题文章46+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

JAVA算法:House Robber(JAVA版本解题) JAVA算法:House Robber(JAVA版本解题) 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [1,2,3... 阅读详情

相关推荐

Buffer Status Reporting(BSR)

所以UE是基于LCG上报BSR,而不是为每个逻辑信道上报一个BSR。以一个实网中的异常场景开始,大概流程是有UL data要发送,UE触发BSR->no UL grant->SR->no UL grant->trigger RACH->RACH fail->RLF->RRC reestablishment:简单描述就是UE触发BSR,此时没有UL grant,之后触发SR,仍然没有 UL grant,之后触发RACH,RACH fail引起RLF,引起RRC reestablishment;

asd199086的博客 2973

打家劫舍问题

打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,。给定一个代表每个房屋存放金额的非负整数数组,计算你,一夜之内能够偷窃到的最高金额。[1,2,3,1]4偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4。12偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

Alingte7的博客 700

告别云端依赖:手把手教你在Windows 10/11上离线部署WhisperDesktop(含模型下载避坑指南)

本文详细介绍了如何在Windows 10/11上离线部署WhisperDesktop,包括硬件要求、模型下载、环境配置和实战应用。通过本地部署,用户可以实现高效的语音转文字功能,无需依赖云端服务,特别适合注重数据隐私和需要离线工作的场景。

weixin_33736048的博客 324

NR BSR流程

2.1 BSR及相关参数描述 BSR概述 在MAC层,BSR流程用来向gNB提供UE的上行数据量信息。协议中划分了3类BSR:Regular BSR,Periodic BSR和Padding BSR,且Padding BSR的优先级低于前两者。 2.2 逻辑信道的可用上行数据量计算 应当将RLC与PDCP的数据量同时考虑在内,具体参考38.322-5.5与38.323-5.6章节。 2.3 触发Regular BSR的事件 属于某个LCG的logical channel有上行数据到达时(becomes

weixin_43620925的博客 9297

转子动力学 | 临界速度与稳定性分析

本文深入探讨了转子动力学中的核心问题——临界速度与稳定性分析。临界速度是旋转机械发生共振的危险转速,通过模态分析和坎贝尔图可进行预测。文章还剖析了油膜涡动等稳定性问题,并结合ANSYS仿真案例,详细阐述了从建模、分析到设计优化的完整工程实践流程,为旋转机械的可靠设计与安全运行提供关键指导。

weixin_29313239的博客 518

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1015

第三章 LTE MAC协议解读 --- 缓冲区状态报告(BSR)

缓冲区状态报告(BSR)     在介绍SR时,我们已经知道上行数据的传输需要的资源是通过BSR来获得,缓冲区状态报告过程用于给服务eNB提供UE有共有多少数据存在上行的缓冲区里需要发送的信息,RRC通过配置的两个定时器periodicBSR-Timer 和retxBSR-Timer 以及对于每一而逻辑信道通过信令指示logicalChannelGroup这个逻辑信道属于哪一个逻辑信道组(LCG

*^^^^^^^* 1万+

RAG-Anything 实战:构建企业级多模态知识图谱问答系统

本文详细介绍了如何利用RAG-Anything构建企业级多模态知识图谱问答系统,解决跨模态文档处理的痛点。通过架构设计解析、部署实战指南和典型业务场景解决方案,帮助企业实现高效的知识管理和智能检索,提升决策效率。

weixin_29089057的博客 386

【LeetCode】198. House Robber

198. House Robber Description: You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing ea...

Microstrong 3704

在Ubuntu22.04.2远程服务器上搭建OHIF+Orthanc

在Ubuntu远程服务器上不翻墙,但是本地windows需要科学上网开始之前,首先在终端输入export -p查看是否有代理端口如下如果有就关了,输入如下命令。

weixin_51116549的博客 1346

点云结构面智能识别与裂隙网络分析系统

点云结构面智能识别系统摘要 本系统采用深度学习与传统几何算法融合的方法,实现岩石结构面的智能识别与分析。系统包含7个核心模块:点云预处理、结构面识别、分组分割、参数计算、粗糙度分析、裂隙网络生成和可视化。技术路线结合PointNet++深度学习架构与RANSAC、区域生长等传统算法,通过预处理→深度学习识别→几何精修→参数计算→网络构建的流程实现高精度分析。预处理模块实现点云降噪、下采样和法向量估计,深度学习模块基于改进的PointNet++架构进行特征提取和分类。系统支持多种点云格式输入,提供完整的结构面

huanghm88的专栏 347

LeetCode-213. House Robber II [C++][Java]

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place arearranged in a circle.That means the first house is the neighbor of the last one.

贫道绝缘子的博客 471

激光打标轴坐标计算分析

‌:基于坐标差的平方和开方运算,勾股定理将几何关系转化为代数计算,从而实现了从坐标到距离的精确转换‌12。直角三角形的应用从上图可以看到A,B,P三个点连起来就是一个直角三角形了。用勾股定理计算距离 C#有相关的方法直接传参数就可以了。很方便。

StevenChen的博客 312

LeetCode House Robber II

原题链接在这里:https://leetcode.com/problems/house-robber-ii/ 是House Robber的进阶题。这里第一家和最后一家不能同时偷,所以像House Robber建立一个res1, 把从第一家到倒数第二家能偷最大值依次存入res1, 再建立一个res2, 把第二家到最后一家能偷最大值依次存入res2. 返回res1最后一个值 和res2最后一个值

Dylan_Java_NYC的博客 593

【nerfStudio】1-在windows上安装nerfStudio

安装Git。安装Visual Studio 2022。在安装CUDA之前必须完成此步骤。必须在“桌面开发与C++”工作流程(在BuildTools版本中称为“C++构建工具”)中包含所需的组件。Nerfstudio要求。我们建议使用conda来管理依赖关系。在继续之前,请确保安装了Conda。 依赖关系 PyTorch 请注意,如果安装了低于2.0.1的PyTorch版本,则应卸载先前版本的pytorch、functorch和tiny-cuda-nn。 基于CUDA 11.8的Torch 2.0.1 安装基

dlhlSC的博客 1693

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LeetCode-198. House Robber [C++][Java]

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security systems connected andit will automatica

贫道绝缘子的博客 371

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

leetcode 198.House Robber-打家劫舍|动态规划

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent house

hdtopku 2832

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LeetCode House Robber

原题链接在这里:https://leetcode.com/problems/house-robber/ 若没有房子,return 0; 若只有一个房子,return nums[0], 也就是这个房子里的钱; 若有两个房子,返回两个房子里钱较多的那个钱。 若是大于两个,因为不能偷邻家,所以新建一个array, 就是res,里面对应的 i 位存能偷到的最多钱的数目, 从前往后每一步都是最优的,就是

Dylan_Java_NYC的博客 558

LeetCode-337. House Robber III(JAVA)(树形结构)

LeetCode-337. House Robber III(JAVA)(树形结构)

mine_song的博客 700

JAVA算法:House Robber I&II&III JAVA版本解题

JAVA算法:House Robber I&II&III JAVA版本解题 LeetCode198.House Robberhttps://leetcode.com/problems/house-robber/ LeetCode213.House Robber IIhttps://leetcode.com/problems/house-robber-ii/ Leet...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 414

LeetCode 337. House Robber III(小偷游戏)

原题网址:https://leetcode.com/problems/house-robber-iii/ The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the "root." Besides the root,

James Pan 1101

[Leetcode学习-java]House Robber III

问题: 难度:medium 说明: 小偷打家劫舍,然后从 root 出发,到一个二叉树形状的村子,然后每两个相互连接的房子一起偷就会报警,要求返回最多能偷钱的数量。 题目连接:https://leetcode.com/problems/house-robber-iii/ 输入案例: Input: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ 3 1 Output: 7 Explanation: Maxim

qq_28033719的博客 161

【Leetcode】213. House Robber II 【动态规划】

213. House Robber II Note: This is an extension of House Robber. After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too

renxingzhadan的专栏 644

LeetCode - 198. House Robber & 213. House Robber II - C++

昨天腾讯笔试题:n个整数的圆环中取m个数,不能取相邻的,求可取出的最大和,同学提醒是LeetCode#213相似题目。 #213是#198的变式,所以又做了一下198. House Robber // dp数组 class Solution { public: int rob(vector&lt;int&gt;&amp; nums) { int length = n...

L_bic的博客 391

LeetCode:House Robber III

House Robber III Total Accepted:13977Total Submissions:37027Difficulty:Medium The thief has found himself a new place for his thievery again. There is only one entrance

walker lee 1811

Java描述 LeetCode,213. House Robber II

大家好,我是河海哥,专注于后端,如果可以的话,想做一名code designer而不是普通的coder,一起见证河海哥的成长,您的评论与赞是我的最大动力。 1-1:题目 You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle..

人在江湖 360
上一篇: LeetCode算法题-Number of 1 Bits(Java实现)
下一篇: LeetCode算法题-Happy Number(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值