专栏首页架构说leetcode打家劫舍问题

leetcode打家劫舍问题

198. 打家劫舍

https://leetcode-cn.com/problems/house-robber/description/

你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。 给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。

  • 分析

首先是问题分解,假设当前已经肆虐过了前i个房子(0...i-1),且dp[i]是抢劫了下标为i的房子时的最大收益,那么可以得到状态转移方程: dp[i]=max(dp[i-1],dp[i-2]+nums[i]); i>2

  • 代码:
class Solution {public:  int rob(vector<int>& nums) 
{ 
  int size=nums.size();  if(size ==0)
  {     return 0;
  }else if(size ==1)
  {    return nums[0];
  }else if(size ==2)
  {    return max(nums[0],nums[1]);
  }  int dp[size]={0};  //不知道啥情况
  dp[0]=nums[0];
  dp[1]=max(nums[0],nums[1]);  for(int i=2;i<size;i++)
  {
    dp[i]=max(dp[i-1],dp[i-2]+nums[i]); //依赖前面的数据

  }  return dp[size-1];
}
};

337. 打家劫舍 III

https://leetcode.com/problems/house-robber-iii/discuss/79330/Step-by-step-tackling-of-the-problemhttp://zxi.mytechroad.com/blog/tree/leetcode-337-house-robber-iii/
  • 分析: 获取给定tree的打劫之后最大收益
  1. 处理当前节点 root
  2. 针对当前节点节点存在2个操作 判断哪个操作收益最大
打(1)      不打      打(3)     不打(1)      打(2 )   不打(3)

具体来说:前三层是逻辑判断

  1. 同样方式 获取给定自第 i i+1层tree的打劫之后最大收益。
func rob(root *TreeNode) int {
	if root == nil {
		return 0
	}
	//按照层次打劫 max(1不打劫 2打劫 3 不打劫 ,1打劫 2不打劫 3 打劫)

	level2 := rob(root.Left) + rob(root.Right)

	var level13 int = 0
	if root.Left != nil {
		level13 += rob(root.Left.Left) + rob(root.Left.Right)
	}
	if root.Right != nil {
		level13 += rob(root.Right.Left) + rob(root.Right.Right)
	}
	level13 += root.Val

	if level2 > level13 {
		return level2
	} else {
		return level13
	}

}
public int rob(TreeNode root) {    if (root == null) return 0;    
    int val = 0;    
    if (root.left != null) {
        val += rob(root.left.left) + rob(root.left.right);
    }    
    if (root.right != null) {
        val += rob(root.right.left) + rob(root.right.right);
    }    
    return Math.max(val + root.val, rob(root.left) + rob(root.right));
}

递归缺点体现出来了 一个节点被会计算多次

计算0层时候 依赖 1层  和2层 计算1层时候 依赖 2层  和 3层计算2层时候 依赖 3层  和 4层节点 1 2 3 被计算2次  

Time complexity: O(n^2)

Space complexity: O(n)

本文分享自微信公众号 - 架构说(JiaGouS),作者:王传义

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 958. 二叉树的完全性检验

    输入:[1,2,3,4,5,null,7] 输出:false 解释:值为 7 的结点没有尽可能靠向左侧

    程序员小王
  • 单链表中头节点作用(深入理解)

    今天QQ群里有人咨询一个问题 例如单链表中头节点作用 然后联想到做项目中解决core一个问题 虽然每天都在吃饭睡觉打豆豆,啥框架业务都不懂 解决了这一个...

    程序员小王
  • Docker源码分析(一):Docker架构

    文章来源: ? InfoQ推出了《Docker源码分析》系列文章。 另外,欢迎加入架构说技术交流群 234303445 1 背景 1.1 Docker简介 Do...

    程序员小王
  • Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865

    zhangrelay
  • 十问泛型,你能扛住吗?

    使用泛型机制编写的代码要比那些杂乱的使用Object变量,然后再进行强制类型转换的代码具有更好的安全性和可读性,也就是说使用泛型机制编写的代码可以被很多不同类型...

    山禾说
  • DedeCMS 20140201 之前的5.7通杀SQL注入漏洞

    V站CEO-西顾
  • 100 个较全面的 IT 热门编程开发视频教程

    程序工场
  • Tool之Debugger

    使用《Tool之TargetServer(vx6)》连接Target后,就可以使用Debugger了

    Taishan3721
  • 为克隆后的CentOS虚拟机设置静态IP

    CentOS虚拟机克隆后,由于网卡MAC地址等信息跟被克隆的系统一致,但是克隆后的虚拟机网卡其实已经变了,所以CentOS不会采用原来的网卡配置文件。所以克隆后...

    KenTalk
  • 精通Java,却不了解泛型?

    在没有泛型的出现之前,我们通常是使用类型为 Object 的元素对象。比如我们可以构建一个类型为 Object 的集合,该集合能够存储任意数据类型的对象,但是...

    蔡不菜丶

扫码关注云+社区

领取腾讯云代金券