文章目录
LeetCode、198. 打家劫舍【中等,一维线性DP】
题目及分类
题目链接:LeetCode、198. 打家劫舍
分类:动态规划/线性DP
思路
线性DP(一维)
思路说明:
首先抓住条件:①无法同时偷连续的两所房子。②每个房屋钱财非负。③找到最贵的一种打劫方案求得最高金额。
采用线性DP,假设dp(i)就是抢夺金额最高的一种方案总金额,即可列出一条递推方程:
dp(i) = Math.max(dp[i - 1], dp[i - 2] + (i < n ? nums[i] : 0)),无非是第i-1的最高金额与i-2偷得到的+当前屋子偷得到的金额取一个最大值即可。
复杂度分析:时间复杂度O(n),空间复杂度O(n)
class Solution {
//dp(i) = Math.max(dp(i-1), dp(i - 2) + nums(i))
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) return nums[0];
int[] dp = new int[n + 1];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i <= n; i ++) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] + (i < n ? nums[i] : 0));
}
return dp[n];
}
}

评论区请在客户端页面查看