题目
解法
因为是首尾相连的
用原来的 198 题的方法有可能会多算一个
经过一番尝试之后,最终使用了两次遍历的方法
第一次,从0开始,不计算最后一个
第二次,从1开始,计算上最后一个
当然,ret 数组可以简化成两个变量,这里就不继续处理了
class Solution {
/**
* @param Integer[] $nums
* @return Integer
*/
function rob($nums) {
$len = count($nums);
if ($len == 1) {
return $nums[0];
} elseif ($len == 2) {
return max($nums[0], $nums[1]);
}
// 从0开始打
$ret = [
$nums[0],
$nums[0],
];
for ($i = 2; $i < $len - 1; $i++) {
$ret[$i] = max($ret[$i - 1], $ret[$i - 2] + $nums[$i]);
}
$max0 = $ret[$len - 2];
// 从1开始打
$ret = [
$nums[1],
$nums[1],
max($nums[1], $nums[2]),
];
for ($i = 3; $i < $len; $i++) {
$ret[$i] = max($ret[$i - 1], $ret[$i - 2] + $nums[$i]);
}
$max1 = $ret[$len - 1];
return max($max1, $max0);
}
}
参考
可以参考一下官方题解,写的更加清晰一些,将打家劫舍的核心逻辑抽象出了一个函数:
打家劫舍 II-官方题解