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

(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学习 Part7:类

    Python学习 Part7:类 1. 作用域和命名空间 命名空间(namespace)就是一个从名称到对象的映射. 命名空间的一些实例:内置名称集(函数,像abs(),和内置异常名称),一个模块中的 ...

  2. form表单发送请求实例

    <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncodi ...

  3. Netty中如何写大型数据

    因为网络饱和的可能性,如何在异步框架中高效地写大块的数据是一个特殊的问题.由于写操作是非阻塞的,所以即使没有写出所有的数据,写操作也会在完成时返回并通知ChannelFuture.当这种情况发生时,如 ...

  4. Linux kernel的中断子系统之(四):High level irq event handler

    返回目录:<ARM-Linux中断系统>. 总结:从架构相关的汇编处理跳转到Machine/控制器相关的handle_arch_irq,generic_handle_irq作为High l ...

  5. 基于Emit实现的C#版本的BeanCopier

    在java的技术栈当中,著名的Cglib库里面有一个BeanCopier,这个类的功能就是可以完成两个对象的属性复制工作(哪怕属于两个不同的类). 今天本人通过.net内置的System.Reflec ...

  6. 为什么选择Spring Boot作为微服务的入门级微框架

    摘要:1. Spring Boot是什么,解决哪些问题 1) Spring Boot使编码变简单 2) Spring Boot使配置变简单 3) Spring Boot使部署变简单 4) Spring ...

  7. python 3 中的raw_input 报错

    raw_input() was renamed to input()

  8. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. 27.app后端搭建聊天服务器的经历

    现在,聊天功能已经成了社交app的标配了.但是,众多web开发出生的程序员对聊天相关的服务的不了解,带来了很多开发上的困扰.在这篇文章中,根据下面3个方面,谈谈聊天服务. 1.      聊天服务的技 ...

  10. python已安装了一个包,但是导入包中的模块时报错没有这个包

    执行import sys; print(sys.path)查看python搜索路径,确保自己的模块在python搜索路径中 python的搜索路径与包(package) python的搜索路径其实是一 ...