前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【LeetCode】198. 打家劫舍 递归递推

【LeetCode】198. 打家劫舍 递归递推

作者头像
韩旭051
发布2020-06-23 10:57:30
发布2020-06-23 10:57:30
53500
代码可运行
举报
文章被收录于专栏:刷题笔记刷题笔记
运行总次数:0
代码可运行

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。 示例 2:

输入: [2,7,9,3,1] 输出: 12 解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目很简单,递归就超时了,,,,但是很容易想到了递归,

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int rob(vector<int>& nums) return max(Max(nums,0,0),Max(nums,0,1));;
    int Max(vector<int>& nums,int count,int i){
        if(i>=nums.size())return count;
        count+=nums[i];
        return max(Max(nums,count,i+2),Max(nums,count,i+3));
    }
};

接着就是把递归转成递推

选第三个,就可以选第一个。

或者不选第三个。

依次类推

first表示第一个数据

second表示第二个数据

nums[i]表示第三个数据

看第二个数据和第一个加第三个那个大,那个大就存那个,然后第二个数据就变成了第一个数据

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int rob(vector<int>& nums) {
        int first = 0,second = 0;
        for(int i=0;i<nums.size();i++){
            int temp=second;
            second=max(first+nums[i],second);
            first=temp;
        }return second;
    }
};
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目很简单,递归就超时了,,,,但是很容易想到了递归,
  • 接着就是把递归转成递推
  • 选第三个,就可以选第一个。
  • 或者不选第三个。
  • 依次类推
  • first表示第一个数据
  • second表示第二个数据
  • nums[i]表示第三个数据
  • 看第二个数据和第一个加第三个那个大,那个大就存那个,然后第二个数据就变成了第一个数据
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档