此题为打家劫舍问题的第一种,也是剩下俩种的核心。后面两种其实是这一种的变体。
问题往简单想,只有当前数组元素抢与不抢。
如果当前节点没有被抢,也就是第n个节点没有被抢,dp[n] = dp[n-1],
dp[n+1] = dp[n] + num = dp[n-1] + num
如果当前节点被抢,也就是第n个节点被抢, 此时**dp[n+1]**不能被抢。因为相邻节点不能被抢。
初始状态:
前0间房子的最大偷窃价值为0,dp[0] = 0
转移方程:
(也就是偷取n+1时,要判断的条件)
dp[n+1] = max(dp[n], dp[n-1] + num[i])
简化复杂度:
dp[n]只与dp[n-1]和dp[n-2]有关系,因此,prev 和cur交替记录,空间复杂度可以降为O(1).
时间复杂度为遍历nums的时间为O(n).
class Solution {
public int rob(int[] nums) {
int n = nums.length;
int prev = 0; // 第n-2个元素
int cur = 0; // 第n-1个元素
for(int i = 0; i < n; i++){
int temp = Math.max(cur, prev + nums[i]); //第n个元素
prev = cur;
cur = temp;
}
return cur;
}