iT邦幫忙

0

[leetcode - Bliend-75 ] 213. House Robber II (Medium)

  • 分享至 

  • xImage
  •  

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have a security system connected, and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.

這題和 198. House Robber (Medium) 差不多但不同的點在於現在房子變成循環的,也就是說如果偷了第一間那麼最後一間也不能偷,同理最後一間偷了則第一間不能偷。

https://ithelp.ithome.com.tw/upload/images/20231231/201247673XQ4Q5ffS1.jpg

Step

因為偷了第一間(從第一間開始)就不能偷最後一間,所以將最後一間移除掉並和 198. House Robber (Medium) 一樣建立 移除掉最後一間房子 的 dp array
https://ithelp.ithome.com.tw/upload/images/20231231/20124767wAdVXAV97a.jpg

接著建立第二個 dp 是從略過第一間,如果略過第一間就可以偷到最後一間(從第二間開始),所以移除掉第一間並和198. House Robber (Medium) 一樣建立 移除掉第一間房子 的 dp array
https://ithelp.ithome.com.tw/upload/images/20231231/20124767iesMvNqbEE.jpg

Create skipLastHouseDp

  1. nums = [2] 則只有一個選項便是 2
    https://ithelp.ithome.com.tw/upload/images/20231231/20124767qeOCaaZhx3.jpg

  1. nums = [2,7] 則有兩個選項,第一個是去第一間拿到 1 塊第二個是去第二間拿到 7 塊,而 7 > 1 則將 7 放入 skipLastHouseDp 中代表 nums = [2,7] 時可以拿到最多的錢。
    https://ithelp.ithome.com.tw/upload/images/20231231/20124767iZlL4X9OuV.jpg

  1. nums = [2,7,9] 有兩個選項
    • 拿 9 和 7 之前的房子中最多錢的,因為 7 連著 9 所以要跳過 7 找 7 之前的最大值
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767iZCgbI1hdd.jpg
    • 不拿 9 而拿 9 之前的房子中最多錢的,而 9 之前最多錢的在 2 (nums = [2,7]) 已經算過並放進 dp 裡面了
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767OB4JcmKisB.jpg
    • 方法一和方法二的最大值放入 dp 中表示 nums = [2,7,9] 時可以拿得最多錢
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767trH6rtKEVm.jpg

  1. nums = [2,7,9,3] 有兩個選項
    • 拿 3 和 9 之前的房子 [2,7] 中最多錢的值相加,因為 9 連著 3 所以要跳過 9 找 9 之前的最大值,而 9 之前的最大值在 2 (nums = [2,7]) 已經算過並放進 dp 裡了
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767oKEsoXVdpB.jpg
    • 不拿 3 而拿 3 之前的房子 [2,7,9] 中最多錢的,而 3 之前最多錢的已經在 3 (nums = [2,7,9]) 中算過並放進 dp 中了
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767X7RSc6nW1B.jpg
    • 方法一和方法二的最大值放入 dp 中表示 nums = [2,7,9,3] 時可以拿得最多錢
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767rFAi4nGfDb.jpg

Create skipFirstHouseDp

  1. 因為要略過第一間房子,所以要從第二間房子開始,而略過第一間房子所以 skipFirstHouseDp 也從 index = 2 開始。
    https://ithelp.ithome.com.tw/upload/images/20231231/20124767JKkkFPxPEo.jpg

  1. nums = [7] 則只有一個選項便是 7
    https://ithelp.ithome.com.tw/upload/images/20231231/20124767Y1fmdX2PBL.jpg

  1. nums = [7,9] 則有兩個選項,第一個是去第一間拿到 7 塊第二個是去第二間拿到 9 塊,而 9 > 7 則將 9 放入 skipFirstHouseDp 中代表 nums = [7,9] 時可以拿到最多的錢。
    https://ithelp.ithome.com.tw/upload/images/20231231/20124767GlLXxejHnh.jpg

  1. nums = [7,9,3] 有兩個選項
    • 拿 3 和 9 之前的房子中最多錢相加,因為 9 連著 3 所以要跳過 9 找 9 之前的最大值
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767zje256jpY9.jpg
    • 不拿 3 而拿 3 之前的房子中最多錢的,而 3 之前最多錢的在 3 (nums = [7,9]) 已經算過並放進 dp 裡面了
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767noHLbwG9K8.jpg
    • 方法一和方法二的最大值放入 dp 中表示 nums = [7,9,3] 時可以拿得最多錢
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767q7j4hSUpRc.jpg

  1. nums = [7,9,3,1] 有兩個選項
    • 拿 1 和 3 之前的房子中最多錢相加,因為 3 連著 1 所以要跳過 3 找 3 之前的最大值,而 nums = [7,9]3 已經算過並放進 skipFirstHouseDp 中了
      https://ithelp.ithome.com.tw/upload/images/20231231/201247673lIphyZS6v.jpg
    • 不拿 1 而拿 1 之前的房子中最多錢的,而 1 之前最多錢的在 4 (nums = [7,9,3]) 已經算過並放進 dp 裡面了
      https://ithelp.ithome.com.tw/upload/images/20231231/20124767MjgeMK6i2H.jpg
    • 方法一和方法二的最大值放入 dp 中表示 nums = [7,9,3,1] 時可以拿得最多錢
      https://ithelp.ithome.com.tw/upload/images/20231231/201247676VQZ8wcvjw.jpg

Answer

比較 skipLastHouseDpskipFirstHouseDp 中最大值便是解答。

Coding

/**
 * @param {number[]} nums
 * @return {number}
 */
var rob = function(nums) {
    if (nums.length === 1) return nums[0];
    if (nums.length === 2) return Math.max(nums[0], nums[1]);

    const skipLastHouse = [];
    skipLastHouse[0] = nums[0];
    skipLastHouse[1] = Math.max(nums[0], nums[1]);
    for(let i = 2; i < nums.length - 1; i++) {
        skipLastHouse[i] = Math.max(nums[i] + skipLastHouse[i - 2], skipLastHouse[i - 1]);
    }

    const skipFirstHouse = [];
    skipFirstHouse[1] = nums[1];
    skipFirstHouse[2] = Math.max(nums[1], nums[2]);
    for(let i = 3; i < nums.length; i++) {
        skipFirstHouse[i] = Math.max(nums[i] + skipFirstHouse[i - 2], skipFirstHouse[i - 1]);
    }

    return Math.max(skipLastHouse[skipLastHouse.length - 1], skipFirstHouse[skipFirstHouse.length - 1]);
};

Time complexity: O(n)


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言