leetcode-213. 打家劫舍 II


题目

213. 打家劫舍 II

解法

因为是首尾相连的
用原来的 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-官方题解