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

(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. HTML 学习笔记 day one

    HTML学习笔记 day one Chapter one 网站开发基础 1.2网站的基本架构 网站的基本要素:内容,页面,超链接 动态网页和静态网页的区别在于:动态网页会自动更新,后缀名是.asp或者 ...

  2. 并查集(union-find set)与Kruskal算法

    并查集 并查集处理的是集合之间的关系,即‘union' , 'find' .在这种数据类型中,N个不同元素被分成若干个组,每组是一个集合,这种集合叫做分离集合.并查集支持查找一个元素所属的集合和两个元 ...

  3. Redis模糊查询

    最近使用Redis优化项目功能,其中有一部分为模糊查询,找了很多帖子,也没有找到很好的解决方案和思路,最终皇天不负有心人啊,终于让我找到了!!! 感谢该帖作者:WalkerAlone  原文链接:ht ...

  4. 第一章:Netty介绍

    1. Netty介绍  Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,Netty是基于NIO实现的,所以整个Netty都是异步操作,网络应用 ...

  5. 如何提高缓存命中率(Redis)

    缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...

  6. BigDecimal 专题

    //****BigDecimal中传入的double类型的数据,要为String类型,不然得到在BigDecimal仍然是不准确的double数据**** // BigDecimal addend = ...

  7. [ Java面试题 ]WEB篇

    1.AJAX有哪些有点和缺点? 优点: 1.最大的一点是页面无刷新,用户的体验非常好. 2.使用异步方式与服务器通信,具有更加迅速的响应能力. 3.可以把以前一些服务器负担的工作转嫁到客户端,利用客户 ...

  8. Android 带你玩转实现游戏2048 其实2048只是个普通的控件

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40020137,本文出自:[张鸿洋的博客] 1.概述 博主本想踏入游戏开放行业,无 ...

  9. Python将html转化为pdf

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

  10. 解决centos7 python3 上下左右变ABCD

    首先:rpm -qa | grep readline //查看有没有安装readline-devel(出现标题的问题就是因为没有安装readline-devel包) 其次:使用yum search r ...