题型:从数组中选择不相邻元素,求和最大

(1)对于数组中的每个元素,都存在两种可能性:(1)选择(2)不选择,所以对于这类问题,暴力方法(递归思路)的时间复杂度为:O(2^n);

(2)递归思路中往往会包含大量的重复计算,从时间角度出发,我们一般都会使用动态规划的方法来解决这类问题;而动态规划的核心思想就是:使用变量或者数组来记录重复出现的部分,这样会大大减少计算量,节省时间。

(3)在使用动态规划的方法解决这类问题时,一般过程是:

  1. 最好先使用暴力分析的方法,按照题意将原题中给出的案例推导出来,然后从中总结规律,便于分析出状态转移方程
  2. 定义DP状态,保存中间变量
  3. 写出状态转移方程

打家劫舍(leetcode 198)

分析:

(1)对于每个数组元素,都有两种选择:选与不选

(2)DP状态:opt[i] 表示:偷到第 i 间房屋时,小偷可以偷到的最大金额

(3)分析状态转移:

选:  opt[i] = opt[i-2] + nums[i]

不选: opt[i] = opt[i-1]

则,opt[i] = max( opt[i-2] + nums[i],  opt[i-1])

python代码实现:

 class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == 0: return 0
elif n < 2: return max(nums)
else:
opt = [0 for i in range(n)] opt[0] = nums[0]
opt[1] = max(nums[0], nums[1]) for i in range(2, n):
opt[i] = max(opt[i-1], opt[i-2]+nums[i]) return opt[-1]

打家劫舍(leetcode:213)

分析:

(1)213与198相比,不同之处:198是首尾不相连的数组,213是首尾相连成环的数组;

(2)在开始做这个题的时候,很容易陷入一个误区:首尾相连成环,就必须得从环的角度出发来解决这个问题,这往往需要考虑很多的边界问题,而且很容易解出来。在这个时候,我们不防转换一下角度,联想一下之前做过的类似题目的思路(198),找一下可以借鉴的部分。

(3)环:首尾相连,每个位置的元素等同,不分初始位置和结束位置,但是环可以拆成首尾不相连的数组形式(198题);

(4)要求是:选择的元素不相邻,所以,现在分为两种情况:1. 选择第一个位置的房屋金钱(不能选择最后一个位置的房屋金钱) 2. 选择最后一个位置的房屋金钱(不能选择第一个位置的房屋金钱),从这个角度就可以将环分成两个首尾不相连的数组形式,再使用198的思路进行求解;

python 代码实现:

 class Solution:
def rob(self, nums: List[int]) -> int:
n = len(nums)
if n == 0: return 0
elif n <= 3: return max(nums)
else:
nums_1 = [nums[i] for i in range(n-1)]
nums_2 = [nums[i] for i in range(1, n)] opt1 = [0 for i in range(n)]
opt2 = [0 for i in range(n)] opt1[0], opt2[0] = nums_1[0], nums_2[0]
opt1[1], opt2[1] = max(nums_1[0], nums_1[1]), max(nums_2[0],nums_2[1])
for i in range(2, n-1):
opt1[i] = max(opt1[i-1], opt1[i-2]+nums_1[i])
opt2[i] = max(opt2[i-1], opt2[i-2]+nums_2[i]) return max(max(opt1), max(opt2))

打家劫舍(leecode:337)

分析:

(1)337是二叉树形式的数组,条件仍然是:选择的元素不相邻;

(2)从根节点出发,(选择的元素不相邻)其实是:不能同时选择父节点和子结点上的元素,但是可以选择兄弟节点,可以选择爷孙节点;

(数据结构中的树模型还没复习到,等复习完树模型之后再回来整理这个题的代码~~)

(leetcode:选择不相邻元素,求和最大问题):打家劫舍(DP:198/213/337)的更多相关文章

  1. 198. 213. 337. House Robber -- 不取相邻值的最大值

    198. House Robber You are a professional robber planning to rob houses along a street. Each house ha ...

  2. 在js中怎么样选择互斥的相邻元素

    在使用jquery中,我们通常会选择siblings()去选择相邻元素,使用eq()方法去匹配元素,使用index()获取对应元素的索引值,具体jquery代码如下: <style> *{ ...

  3. 基于visual Studio2013解决C语言竞赛题之0520相邻元素

          题目

  4. jquery 子元素 后代元素 兄弟元素 相邻元素

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content ...

  5. jQuery中的层级选择器(四、二):后代元素、子元素、相邻元素、兄弟元素

    <!DOCTYPE html> <html> <head> <title>层次选择器</title> <meta http-equiv ...

  6. 深入学习jQuery选择器系列第二篇——过滤选择器之子元素选择器

    × 目录 [1]通用形式 [2]反向形式 [3]首尾元素 [4]唯一元素 前面的话 在上一篇中已经介绍过基础选择器和层级选择器,本文开始介绍过滤选择器.过滤选择器是jQuery选择器中最为庞大也是最为 ...

  7. [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数

    一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...

  8. css3类选择器之结合元素选择器和多类选择器

    css3类选择器之结合元素选择器和多类选择器用法: <!DOCTYPE html> <html lang="en"> <head> <me ...

  9. 日常踩坑 — 相邻元素之间的margin合并问题。

    踩坑:使用v-for渲染的组件,当然图中的id已经换成class,还是没有解决这个问题,于是各种查找资料,我就不信简单的CSS问题这么难解决! v-for渲染组件级传值: <div class= ...

随机推荐

  1. python爬虫入门(二)Opener和Requests

    Handler和Opener Handler处理器和自定义Opener opener是urllib2.OpenerDirector的实例,我们之前一直在使用urlopen,它是一个特殊的opener( ...

  2. Maven项目管理工具

    Maven项目管理工具 白面郎君 Svn eclipse maven量级 1 Maven的简介 1.1 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目 ...

  3. 关于HTML5中的sessionStorage和localStorage

    需求: 做项目的时大多数情况下我们需要对请求的数据进行多次复用,为了降低请求次数我们需要对请求的数据进行本地存储: 以前用的cooking来存储为本地数据,HTML5后提出sessioStorage. ...

  4. js万年历,麻雀虽小五脏俱全,由原生js编写

    对于前端来说,我们可能见到最多的就是各种各样的框架,各种各样的插件了,有各种各样的功能,比如轮播啊,日历啊,给我们提供了很大的方便,但是呢?我们在用别人这些写好的插件,框架的时候,有没有试着问一问自己 ...

  5. Java (六、String类和StringBuffer)

    Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 // ==比较的是字符串在栈中存放的 ...

  6. springboot+redis实现分布式session共享

    官方文档,它是spring session项目的redis相关的一个子文档:https://docs.spring.io/spring-session/docs/2.0.0.BUILD-SNAPSHO ...

  7. spring中bean的scope属性理解

    bean的scope属性有prototype,singleton,request, session几个属性 spring和struts2整合的时候,struts2的action要配置成scope=&q ...

  8. 利用AOP实现SqlSugar自动事务

    先看一下效果,带接口层的三层架构: BL层: public class StudentBL : IStudentService { private ILogger mLogger; private r ...

  9. 【手记】ASP.NET提示“未能创建类型”处理

    我是在本机启动IIS Express调试一个ashx(一般处理程序)时遇到这个报错,网上的说法普遍有这么几种: 把bbb.ashx中的Class="aaa.bbb" 改为Class ...

  10. Kali Linux图形界面与命令行界面的切换

    前言: 有时候为了节约系统资源,使用命令行界面能够让Linux系统的运行更加流畅,处理任务的速度也更加快.现在的Kali安装完成后默认是开机就启动图形化界面.本文将介绍通过编辑Kali启动引导文件的方 ...