213.打家劫舍II
Posted HardyDragon_CC
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了213.打家劫舍II相关的知识,希望对你有一定的参考价值。
思路
- 考虑不包含头元素和不包含尾元素的两种情况,取最大值;
- 利用函数求区间的最大金额
class Solution {
public int rob(int[] nums) {
if(nums.length == 1) return nums[0];
if(nums.length == 2) return Math.max(nums[0],nums[1]);
// 不包含尾元素的区间最高金额
int r1 = robRange(nums,0,nums.length-1);
int r2 = robRange(nums,1,nums.length);
return Math.max(r1,r2);
}
// 返回指定区间的最高金额
public int robRange(int[] nums,int start ,int end){
// 单个元素直接返回
if(start == end) return nums[start];
int size = nums.length;
int[] dp = new int[size];
// 开始区间的前两个元素初始化为nums对应的金额,dp【start+1】为前两个最大
dp[start] = nums[start];
dp[start + 1] = Math.max(nums[start],nums[start+1]);
// 从开始位置第三个开始,到end结束。
for(int i = start + 2;i < end;i++){
dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
}
// 返回 end 的值
return dp[end-1];
}
}
以上是关于213.打家劫舍II的主要内容,如果未能解决你的问题,请参考以下文章