经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
198. House Robber
来源:cnblogs  作者:PilgrimHui  时间:2018/10/8 8:49:50  对本文有异议

问题

非负数组表示每个房子拥有的金钱,抢了一个房子后不能抢隔壁房子的,求能抢到的最大数额。

Input: [1,2,3,1]
Output: 4
Explanation: 1 + 3 = 4.

思路

用dp[i]表示以index i结尾的子数组里,能抢的金钱最大和(不一定要抢nums[i])。
可以得到dp公式为:\(dp[i] = max(dp[i-1], dp[i-2] + nums[i])\)
因为dp只取决于前两个数,可以用两个变量f1和f2优化,省去dp的数组空间开销。

时间复杂度O(n),空间复杂度O(1)

代码

  1. class Solution(object):
  2. def rob(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. if(len(nums) == 0):
  8. return 0
  9. elif(len(nums) == 1):
  10. return nums[0]
  11. f2 = nums[0]
  12. f1 = max(nums[0], nums[1])
  13. for i in range(2,len(nums)):
  14. f1, f2 = max(f2+nums[i], f1), f1
  15. return f1
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号