打家劫舍

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

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

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


动态规划

分析

假设dp[ i ]为前 i 间房屋所能得到的最大利益,那么dp[ i ]为以下两种情况的最大值:1.第 i 间房屋不偷,则当前最大利益为前 i - 1 间房的最大利益,即dp[ i ] = dp[ i - 1 ];2.第 i 间房屋偷,则当前最大利益为前 i - 2 间房的最大利益加上第 i 间房的利益,即dp[ i ] = d[ i - 2 ] + nums[ i ];(相邻两间房屋不能偷)

状态转移方程:dp[ i ] = max{ dp[ i - 1 ],dp[ i - 2 ] + nums[ i ] }

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

模拟

分析

如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警(即相邻的数字不能同时作为最终求和的有效数字)。那么我们很容易联想到求出奇数和以及偶数和,比较这两个谁更大,谁就是最优解。事实上还有一种情况可能出现最优解,即部分是奇数和,部分是偶数和,例如[3,1,1,5,1,7,1]这样的房屋排列,无论小偷偷奇数位置的房屋还是偶数位置的房屋都不能偷得最多的钱。所以我们在求和时还要将奇数和或偶数和更新为当前最大和,以至于当前和总是处于最优的状态。最后返回两个和中的最大值。

class Solution {
public int rob(int[] nums) { int sumEven = 0;
int sumOdd = 0; for(int i = 0; i < nums.length; i++){ if(i % 2 == 0){ sumEven += nums[i];
sumEven = Math.max(sumEven, sumOdd);
}else{ sumOdd += nums[i];
sumOdd = Math.max(sumEven, sumOdd);
}
} return Math.max(sumEven, sumOdd);
}
}

【LeetCode】198. 打家劫舍的更多相关文章

  1. [LeetCode] 198. 打家劫舍II ☆☆☆(动态规划)

    描述 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的 ...

  2. LeetCode 198. 打家劫舍(House Robber) 5

    198. 打家劫舍 198. House Robber 题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两 ...

  3. [LeetCode] 198. 打家劫舍 ☆(动态规划)

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

  4. Java实现 LeetCode 198 打家劫舍

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

  5. leetcode 198打家劫舍

    讲解视频见刘宇波leetcode动态规划第三个视频 记忆化搜索代码: #include <bits/stdc++.h> using namespace std; class Solutio ...

  6. leetcode 198 打家劫舍 Python 动态规划

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

  7. LeetCode 198. 打家劫舍(House Robber)LeetCode 213. 打家劫舍 II(House Robber II)

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

  8. 力扣Leetcode 198. 打家劫舍

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

  9. [LeetCode]198. 打家劫舍(DP)

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

  10. Leetcode——198. 打家劫舍

    题目描述:题目链接 这道题目也是一道动态规划的题目: 分析一道动态规划的题目可以将解决问题的思路分为下面三个部分: 1:问题的描述.可以定义数组d[ i ] 用于表示第i -1家可以获得的最大金额. ...

随机推荐

  1. Java面试基础 -- Git篇

    1.Git和SVN有什么区别? Git SVN Git是一个分布式的版本控制工具 SVN 是集中版本控制工具 它属于第3代版本控制工具 它属于第2代版本控制工具 客户端可以在其本地系统上克隆整个存储库 ...

  2. Springboot 整合 MyBatis(一):跑起来

    0x1 环境 1. 系统:Windows 10 2. IDE:IntelliJ IDEA 2018.3 x64 0x2 创建项目 1.创建一个SpringBoot项目 选择Spring Initail ...

  3. 在Ubuntu上安装Miniconda

    在Ubuntu上安装Miniconda Anaconda是一个开源的Python包管理器,而Miniconda则是轻量级的Anaconda 下载地址:https://docs.conda.io/en/ ...

  4. bay——巡检RAC日志.txt

    -查找超过800M大小文件,并显示查找出来文件的具体大小,可以使用下面命令 find . -type f -size +400M -print0 | xargs -0 du -h --查看当前目录下每 ...

  5. 网络管理和nmcli命令的使用——网络接口配置-bonding实验步骤

    (实验)网络接口配置-bonding  Bonding 将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡.直接给两块网卡设置同\一IP地址是不可以的.通过bonding,虚拟一块网 ...

  6. [日常] win10开启和安装ubuntu子系统

    在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统 在微软商店里搜索ubuntu,直接点击安装就可以了 安装完成后的windows与linux的磁盘映射见 ...

  7. CGAL的安装与使用

    CGAL CGAL系大名鼎鼎的计算几何算法库,采用C++语言,代码中大量使用模板,相对比较难读.可以支持float, double, CORE的高精度或者gmp等任意精度库. 安装CGAL 在Wind ...

  8. 01. Go 语言简介

    Go语言简介 引用原文地址:http://m.biancheng.net/golang/ Go语言也称 Golang,兼具效率.性能.安全.健壮等特性.这套Go语言教程(Golang教程)通俗易懂,深 ...

  9. SSM 实现登录注册功能

    1.上一篇SSM框架搭建好了之后就要开始写功能了,现在来写一个简单的登录注册功能 这几个包是自己手动创建的,然后往里面写代码 2.代码详情 package com.maike.controller; ...

  10. import和from...import

    目录 一.import 模块名 二.from 模块名 import 具体的功能 三.import和from...import...的异同 一般使用import和from...import...导入模块 ...