前往
大廳
主題

LeetCode - 213. House Robber II 解題心得

Not In My Back Yard | 2022-05-31 12:00:07 | 巴幣 0 | 人氣 225

題目連結:


題目意譯:
你是一個專業的小偷,目前計劃著要在一條街上沿途闖空門。每間房子存有一定數量的錢。這個地區所有的房子圍成一個圓圈,這代表著第一間房子與最後一間房子是相鄰的。除此之外,相鄰房子之間有安全系統連接在一起,而且如果兩個相鄰房子在同一晚都遭闖入時會自動通知警察。

給定一個非負整數的數列 nums,代表著每間房子含有的錢。判斷在不驚動警察的狀況下,你今晚可以獲得的最大金額為何。

限制:
1 ≦ nums.length ≦ 100
0 ≦ nums[i] ≦ 1000



範例測資:
範例 1:
輸入: nums = [2,3,2]
輸出: 3
解釋: 你不得同時搶 1 號房子(金額 = 2)然後又去搶 3 號房子(金額 = 2),因為它們是相鄰的房子。

範例 2:
輸入: nums = [1,2,3,1]
輸出: 4
解釋: 搶 1 號房子(金額 = 1)然後又去搶 3 號房子(金額 = 3)。
你能搶得的總額 = 1 + 3 = 4。

範例 3:
輸入: nums = [1,2,3]
輸出: 3


解題思維:
(令 n = nums.length,也就是用 n 代表房子數量)
首先根據題意可以看到如果我們搶了 1 號房子,我們就不可能去搶 n 號房子;反之亦然,搶了 n 號就搶不了 1 號。

因此我們可以把這 n 個繞成一圈的房子之最佳搶法看成是從兩個子問題的最佳搶法中挑最棒的出來,而那兩個子問題分別是
一:直接忽略 n 號房子,只考慮 1 ~ n - 1 號的房子之最佳搶法;
二:直接忽略 1 號房子,只考慮 2 ~ n 號的房子之最佳搶法。
而且可以看到不管是子問題一或是二,兩者的房子不再是繞成一圈的了(因為少了圓圈上的一間房子)。因此此時便可以使用系列第一題(也就是這題)的策略來解掉這兩個子問題。

而所求即為這兩個子問題中獲利最大者。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作