【leetcode】198. 打家劫舍

51 阅读1分钟

leetcode-198.png

动态规划

不能连续的抢劫两家,对于这里的状态转移方程就是
当前的这一家不抢 vs 抢劫当前这一家,选取一个最大值

dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i])

dp题解

var rob = function (nums) {
    let n = nums.length
    if (n === 0) {
        return 0
    } else if (n === 1) {
        return nums[0]
    } else if (n === 2) {
        return Math.max(nums[0], nums[1])
    }
    let dp = new Array(n).fill(0)
    dp[0] = nums[0]
    dp[1] = Math.max(nums[0], nums[1])
    let res = 0
    for (let i = 2; i < n; ++i) {
        dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2])
        // 记录最大值
        res = Math.max(res, dp[i])
    }
    return res
};

空间复杂度:O(n)

var rob = function (nums) {
    let n = nums.length
    if (n === 0) return 0
    if (n === 1) return nums[0]
    let prev2 = 0, prev1 = nums[0]
    for (let i = 1; i < n; ++i) {
        // 不抢 vs 抢
        let current = Math.max(prev1, prev2 + nums[i])
        prev2 = prev1
        prev1 = current
    }
    return prev1
};

空间复杂度:O(1)

类似于斐不拉契数列,这里要维护一个数组,是属于可以但是没必要,因为就跟前两个状态相关,不需要记录太多,所以可以优化空间复杂度,只记录前两个状态即可。