当前位置: 首页 > article >正文

算法题之打家劫舍

打家劫舍

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

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

示例 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 。

提示:

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

解题思路

这道题属于动态规划的一道题。

从题目上来看,主要的条件其实是相邻的房屋不能偷。

我们可以每次记录一下不偷上一个房屋和偷了上一个房屋的最高金额,分别用preNoTheft、preTheft表示。然后当遍历到当前的房屋时,我们需要记录一下不偷当前房屋和偷了的最高金额:

  • 不偷当前房屋的最高金额:由于不偷当前房屋的金额,其实就是从不偷上一个房屋和偷了上一个房屋的最高金额之间找一个最大值,即max(preNoTheft, preTheft)。
  • 偷了当前房屋的最高金额:如果要偷当前房屋的金额,那么就不能偷上一个房屋的金额,假设当前房屋的金额是money(x),那么偷了当前房屋的金额是preNoTheft + money(x);这里的话,我们需要与偷了上一个房屋的最高金额相比较,获取最大值。

最后,我们依次遍历获得不偷当前房屋和偷了的最高金额,从中比较获取到较大的金额,这个金额就是最高金额了。

具体的代码如下所示:

class Solution {public int rob(int[] nums) {if(nums.length == 0)return 0;int theft = nums[0];int noTheft = 0;int preTheft = theft, preNoTheft = noTheft;for(int i = 1; i < nums.length; i++){noTheft = Math.max(preTheft, preNoTheft);theft = Math.max(preNoTheft + nums[i], preTheft);preNoTheft = noTheft;preTheft = theft;}return Math.max(noTheft, theft);}
}

复杂度分析

  • 时间复杂度:O(n),需要遍历一遍数组。
  • 空间复杂度:O(1),只需要常量的空间存储变量。
http://www.lryc.cn/news/2420011.html

相关文章:

  • 高通WCD9375音频编解码器/数字滤波器芯片介绍
  • 代码思维?烤肠3块1根,5块2根,女子直接报警称诈骗
  • Webgame的市场分析和前景展望
  • php试纸是干什么用,怎样做ph试纸
  • 盘点2017年的非技术阅读
  • 集团网站建设中的网站导航设计
  • 自定义widget
  • proxy php,phpMyProxy
  • 访问www.baidu.com后会发生什么(一次完整的网络通讯过程)
  • J-Link、ST-Link、DAPLink、ULink仿真器区别?以及支持的JTAG、SWD、SWIM下载模式、SWV、串口Printf调试差异?
  • C#/WPF/.NET 第三方ddl强签名解决(xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
  • 万字长文带你由浅入深夯实ARM汇编基础——汇编指令及寻址方式最全梳理(附示例)!
  • HTTP头信息解读
  • Android 自定义ProgressBar显示百分比
  • 通过华为云配置SSL证书-DV
  • win11如何获取推送 Windows11系统电脑获取推送的设置方法
  • Fedora 16 仓库
  • 最全android Demo
  • Ajax(js)2018-8-7
  • 最后一个稳定版本?iOS14.8正式版推送
  • Oracle 11g 详细安装教程 Windows版
  • 最优化方法复习——线性规划之单纯性法
  • PyTorch 1.7 Video 初体验(Video Datasets,Video IO,Video Classification Models,Video Transform)
  • Transformer + SD解析与实战——Datawhale AI视频生成学习2
  • linux ftp 配额 quota,linux – vsftpd中的配额?
  • Microsoft Visual C++ Runtime Library Runtime Error的解决的方法
  • HTML基础知识,全是干货
  • CentOS7 Nginx配置ssl证书实现https安全访问
  • 门诊软件(集药房管理、划价收费、电子病历、电子处方、诊疗卡、财务为一体)
  • 9、include 文件包含