打家劫舍

  • 题目
  • 函数原型
  • 边界判断
  • 算法设计:递归
  • 算法设计:递归+记忆化搜索
  • 算法设计:动态规划

题目

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

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

示例 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 。

函数原型

C 的函数原型:

int rob(int* nums, int numsSize){}

边界判断

int rob(int* nums, int numsSize){if( nums == NULL || numsSize == 0 )return 0;
}

算法设计:递归

inline int max(int a, int b){return a > b ? a : b;
}int __rob(int *nums, int numsSize, int index){if( index >= numsSize )return 0;int max_ans = 0;for(int i=index; i<numsSize; i++)max_ans = max( max_ans, nums[i] + __rob(nums, numsSize, i + 2) );return max_ans;
}int rob(int* nums, int numsSize){if( nums == NULL || numsSize == 0 )return 0;return __rob(nums, numsSize, 0);
}

递归的复杂度:

  • 时间复杂度: Θ ( 2 n ) \Theta(2^{n}) Θ(2n)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)

算法设计:递归+记忆化搜索

int memo[1<<10];    // 左移10位,相当于乘10个2
inline int max(int a, int b){return a > b ? a : b;
}int __rob(int *nums, int numsSize, int index){if( index >= numsSize )return 0;if( memo[index] )return memo[index];int max_ans = 0;for(int i=index; i<numsSize; i++)max_ans = max( max_ans, nums[i] + __rob(nums, numsSize, i + 2) );memo[index] = max_ans;return max_ans;
}int rob(int* nums, int numsSize){if( nums == NULL || numsSize == 0 )return 0;return __rob(nums, numsSize, 0);
}

递归+记忆化搜索的复杂度:

  • 时间复杂度: Θ ( n ) \Theta(n) Θ(n)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)

算法设计:动态规划

从前往后递推…

状态转移方程: d p [ i ] = m a x ( d p [ i − 1 ] , d p [ i − 2 ] + n u m s [ i ] ) dp[i] = max(dp[i-1], dp[i-2] + nums[i]) dp[i]=max(dp[i−1],dp[i−2]+nums[i])

inline int max(int a, int b){return a > b ? a : b;
}int rob(int* nums, int numsSize){int n = numsSize;if( n == 0 )return 0;if( n == 1)return nums[0];int memo[1<<10];memset(memo, 0, sizeof(int) * 1024);memo[0] = nums[0];memo[1] = max(nums[0], nums[1]);for(int i=2; i<n; i++)memo[i] = max(memo[i-1], (memo[i-2]+nums[i]));return memo[n-1];
}

or

从后往前递推:

inline int max(int a, int b){return a > b ? a : b;
}int rob(int* nums, int numsSize){int n = numsSize;if( n == 0 )return 0;int memo[1<<10];memset(memo, 0, sizeof(int) * 1024);memo[n-1] = nums[n-1];for(int i=n-2; i>=0; i--)for(int j=i; j<n; j++)memo[i] = max( memo[i] , nums[j] + (j + 2 < n ? memo[j+2] : 0) );return memo[0];
}

动态规划的复杂度:

  • 时间复杂度: Θ ( n ) \Theta(n) Θ(n)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)

[198].打家劫舍相关推荐

  1. LeetCode-动态规划-198. 打家劫舍

    198. 打家劫舍 思路:dp[i] = max(dp[i-2]+nums[i], dp[i-1]) class Solution {public:int rob(vector<int>& ...

  2. 198. 打家劫舍 golang 动态规划 数组越界

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

  3. leetcode - 198. 打家劫舍

    198. 打家劫舍 -------------------------------------- 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房 ...

  4. 动态规划——斐波那契数列(70. 爬楼梯、198. 打家劫舍、213. 打家劫舍II、信件错排、母牛生产)

    递归和动态规划都是将原问题拆分成多个子问题然后求解,但是动态规划存储了子问题的解,不需要重复计算. 动态规划(Dynamic Programming,DP)需要转移方程和边界条件. 目录 一.70. ...

  5. 模拟卷Leetcode【普通】198. 打家劫舍

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

  6. leetcode 198打家劫舍

    leetcode 198打家劫舍 题目链接:打家劫舍 题目描述:你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间 ...

  7. 代码随想录Day48|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

    文章目录 198.打0家劫舍 213.打家劫舍II 337.打家劫舍III 198.打0家劫舍 文章讲解:代码随想录 (programmercarl.com) 题目链接:198. 打家劫舍 - 力扣( ...

  8. 力扣198.打家劫舍---动态规划与滚动数组

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

  9. day40|198.打家劫舍、213.打家劫舍II、337.打家劫舍III

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

  10. Day48 | 198. 打家劫舍 | 213.打家劫舍Il |337. 打家劫舍 III

    198. 打家劫舍 注意点: 1. 递推公式,dp[j-2]+nums[j]表示的是加上nums[j]后dp[j]的值, dp[j-1]表示的是不加nums[j]后dp[j-1]的最大值 class ...

最新文章

  1. 博客大事记之迁移博客到香港主机
  2. cordova切换到安卓5.1.0,Android SDK not found
  3. html设置模块宽度为200像素,css 宽度(CSS width)
  4. Mac 下使用 homebrew 切换不同版本 php
  5. java基础---对象锁和类锁的区别
  6. 看完这篇,终于知道自己会不会 C# 泛型了!
  7. 如何枚举String类型的枚举?
  8. silverlight 初始页面进行安装主应用(初始安装xap,本地加载xap),实现silverlight程序成桌面应用程序。
  9. 微信小程序公众平台如何生成小程序码
  10. java resource文件_利用java如何实现读取resource目录下文件
  11. 深度丨《纽约时报》两万字长文,深度剖析谷歌大脑简史
  12. 【区块链技术工坊32期】陈军:区块链+供应链金融解决方案及落地案例
  13. vue element-ui el-form表单验证表单验证,数值输入验证踩坑
  14. 【文本标注】文本标注工具brat的使用
  15. JAVA入门第二季 第一章 类和对象
  16. SSD202 移植 新屏幕
  17. STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件
  18. TextInputLayout字数统计功能
  19. 程序员工作四五年后,就算大龄了吗?
  20. 大专(高职)到底值不值得读

热门文章

  1. 智能家居一智能插座 Homekit
  2. Excel中FgColorsum函数根据字体颜色求和
  3. latex tips 偏导数符号 单词partial+倒三角 \nabla
  4. linux微信原生版2.1.5,优麒麟版重新打包,适用于debian内核系统
  5. iOS实现微信发送位置效果
  6. ubuntu设置时间为utc标准时间
  7. 单应性矩阵的理解及求解1
  8. Quartus编译错误:which fans out to accumulate:inst4|acc[12] cannot be assigned more than one value
  9. VLOOKUP函数使用及注意事项
  10. java 制作签名版电子合同pdf版本