leetcode198之打家劫舍问题
dp[i]=max(dp[i−2]+nums[i],dp[i−1])
1 # 打家劫舍问题 2 def rob(nums): 3 ''' 4 5 :param nums: 6 :return: 7 ''' 8 size = len(nums) 9 dp = [0] * size 10 11 if size == 0: 12 return 0 13 14 if size == 1: 15 return nums[0] 16 17 dp[0] = nums[0] 18 dp[1] = max(nums[0], nums[1]) 19 20 for i in range(2, size): 21 dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]) 22 23 return dp[size - 1]
需要注意的特殊情况:
当房屋数为0时,即数组为空数组时,此时应加额外条件进行判断,返回值为0;当房屋数为1时,为两者中最大值
复杂度分析:
时间复杂度:因为遍历了一遍数组,所以时间复杂度为O(n),n为数组长度
空间复杂度:O(1)。使用滚动数组,存储的是当前房屋的前两间房屋的最大值,而不需要存储整个数组,因此空间复杂度为O(1)