这系列题的背景:有个小偷要偷钱,每个屋内都有一定数额的钱,小偷要发家致富在北京买房的话势必要把所有屋子的钱都偷了,但是屋子之内装了警报器,在一定条件下会触发朝阳群众的电话,所以小偷必须聪明一点,才能保证偷到的钱最多。

问题i:这些屋子排成一排,连续两家失窃就会触发朝阳群众电话

问题ii:这些屋子两成一个圈(四合院既视感),连续两家失窃就会触发朝阳群众电话

问题iii:这些屋子组成一棵树,有连接的两个节点同时失窃就会触发朝阳群众电话

i: 思路:一道典型的dp问题,dp[i]表示在小偷路过第i间房子后可以获得的最大收益。小偷这个时候有两个选择,to steal or not to steal, that is a  problem。考虑到会报警的情况,如果第i-1间房子小偷没下手的话,那么 dp[i] = dp[i-1]+nums[i];如果第i-1间的房子小偷下手的话,那么dp[i] = dp[i-1],如果小偷想把自己的利益最大化,比如会有 dp[i] = max(dp[i-1]+nums[i],dp[i-1]),不对啊,这个怎么看都是前者比较大吧?其实还有个隐藏的细节在这里,如果第i-1间房子没有下手的话, dp[i-1] = dp[i-2]。所以dp的状态方程就变成dp[i] = max(dp[i-2]+nums[i],dp[i-1])。由于咱们实际上只需要3个变量就足以记录dp信息,所以就不用数组记录dp信息啦。

         int size = nums.size();
     if(size == 0) return 0;
if(size == 1) return nums[0];
if(size == 2) return max(nums[0],nums[1]);
int s1 = nums[0],s2 = max(nums[0],nums[1]),s3;
for(int i = 2;i<size;i++){
s3 = max(s2,s1+nums[i]);
s1 = s2;s2 = s3;
}
return s3;

ii: 思路:给的仍然是一个数组,只是第一间房子和最后一间房子不能同时下手,其实仍然是问题i的变形而已,只要不同时取到第一间和最后一间就行啦。所以有两种情况,一个是我不考虑最后一间,即考虑从第1到第n-1间房子;另一个是我不考虑第一间,即考虑从第2到第n间的情况。然后比较这两种情况。

        int size = nums.size();
if(size == 0) return 0;
if(size == 1) return nums[0];
if(size == 2) return max(nums[0],nums[1]);
if(size == 3) return max(max(nums[0],nums[1]),nums[2]);
vector<int> dp(size-1,0),dp2(size-1,0);
int s1 = nums[0],s3 = nums[1],s2 = max(nums[1],nums[2]),s4 = max(nums[2],nums[1]), s5,s6; for(int i = 2;i<size-1;i++){
s5 = max(s1,s2+nums[i]);
s6 = max(s3,s4+nums[i+1]);
s1 = s2; s2 = s5;
s3 = s4; s4 = s6;
} return max(s5,s6);

iii:这道题的画风和i&&ii不太一样,感觉考察的是树的问题。我AC的解法效率不高,不过便于理解,用一个flag辅助判断,如果flag为1表示当前节点不能偷;如果flag为0,当前节点可以偷,但是小偷有两种选择,to steal or not to steal,这取决了会不会让利益最大化。所以用一个递归解决了。

class Solution {
public:
int helper(TreeNode* root,bool flag){
if(!root) return 0;
if(flag) return helper(root->left,0)+helper(root->right,0);
else return max(root->val+helper(root->left,1)+helper(root->right,1),helper(root->left,0)+helper(root->right,0));
}
int rob(TreeNode* root) {
return helper(root,0);
}
};

  

解题思路:house robber i && ii && iii的更多相关文章

  1. House Robber I & II & III

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

  2. [LeetCode] 45. Jump Game II 解题思路

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  3. leetcode day6 -- String to Integer (atoi) &amp;&amp; Best Time to Buy and Sell Stock I II III

    1.  String to Integer (atoi) Implement atoi to convert a string to an integer. Hint: Carefully con ...

  4. leetcode array解题思路

    Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...

  5. [LeetCode] Contains Duplicate(II,III)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  6. [LeetCode] 3Sum 解题思路

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  7. 买卖股票的最佳时机I II III IV

    I 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. II 假设有一个数组,它的第i个元素是一个给定的股票 ...

  8. Leetcode 137. Single Number I/II/III

    Given an array of integers, every element appears twice except for one. Find that single one. 本题利用XO ...

  9. n皇后2种解题思路与代码-Java与C++实现

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了n皇后问题的解题思路,并分别用java和c++实现了过程,最后,对于算法改进 ...

随机推荐

  1. DocsBuilderGUI 工具使用介绍

  2. 开源项目 log4android 使用方式详解

    话不多说, 直接上主题. log4android 是一个类似于log4j的开源android 日志记录项目. 项目基于 microlog 改编而来, 新加入了对文件输出的各种定义方式. 项目地址: 点 ...

  3. HTML5开发在2017年发展趋势如何?

    随着移动互联网行业的飞速发展,人们借助于网络相互传达获取的信息越来越广泛,互联网前端开发中HTML5是最受关注的热点,HTML5让开发者和用户重新的对网页有了新的认识,从浏览器到APP都在受h5带来的 ...

  4. Python爬虫利器:Beautiful Soup

    Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.使用它来处理HTML页面就像JavaScript代码操作HTML DOM树一样方便.官方中文文档地址 1. 安 ...

  5. 75、django之ORM补充

    本篇导航: QuerySet 中介模型 查询优化 一.QuerySet 1.可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. > ...

  6. Vue单页面骨架屏实践

    github 地址: VV-UI/VV-UI 演示地址: vv-ui 文档地址:skeleton 关于骨架屏介绍 骨架屏的作用主要是在网络请求较慢时,提供基础占位,当数据加载完成,恢复数据展示.这样给 ...

  7. ibv_get_device_name()函数

    const char *ibv_get_device_name(struct ibv_device *device); 描述 函数用来获取一个与RDMA设备相关联的名字 注意 这个名字在一台特定的机器 ...

  8. PostgreSQL索引描述

    索引方式:唯一索引,主键索引,多属性索引,部分索引,表达式索引. 索引类型:B-Tree,Hash,GiST,GIN以及表达式索引 PostgreSQL所有索引都是“从属索引”,也就是说,索引在物理上 ...

  9. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  10. c++简单编写线性表(实验)

    哇 好久没更博客了  因为从上次更文到现在为止,我一直在学c#,然后也觉得没什么太大的东西想写在博客上, 总之这次就简单的传一下学校安排的数据结构的实验,我还是学生,是新手,希望能继续跟大家一起学习, ...