LeetCode.打家劫舍問(wèn)題

一.LeetCode198.打家劫舍

1.題目鏈接

https://leetcode-cn.com/problems/house-robber/

2.題目

你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋健爬。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入献联,系統(tǒng)會(huì)自動(dòng)報(bào)警蛮原。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組历谍,計(jì)算你在不觸動(dòng)警報(bào)裝置的情況下,能夠偷竊到的最高金額蔓腐。

3.舉例

示例1

輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號(hào)房屋 (金額 = 1) ,然后偷竊 3 號(hào)房屋 (金額 = 3)逗鸣。
     偷竊到的最高金額 = 1 + 3 = 4 合住。

示例2

輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號(hào)房屋 (金額 = 2), 偷竊 3 號(hào)房屋 (金額 = 9),接著偷竊 5 號(hào)房屋 (金額 = 1)撒璧。
     偷竊到的最高金額 = 2 + 9 + 1 = 12 透葛。

4.解題思路

1.顯然要采用動(dòng)態(tài)規(guī)劃法,假設(shè)從最后一家店鋪開(kāi)始搶卿樱,那么只會(huì)遇到2種情況僚害,即:搶這家店和下下家店,或者不搶這家店,即dp[n]=max{dp[n-1],dp[n-2]+arr[n]}萨蚕。
2.如果采用暴力的算法靶草,我們來(lái)分析一下:
如果我們開(kāi)始搶的是第n-1家店,那么后面可以是(n-3,n-4,n-5,n-6....);
如果我們開(kāi)始搶的是第n-2家店岳遥,那么后面可以是(n-4,n-5,n-6,....);
那么這兩種情況顯然n-3之后的n-4,n-5,n-6,....都重復(fù)計(jì)算了奕翔。顯然這里有非常大的優(yōu)化空間,通常我們使用空間來(lái)?yè)Q時(shí)間,即用一個(gè)result數(shù)組記錄每次計(jì)算的結(jié)果浩蓉,這樣每次情況只需要計(jì)算一次派继,再次遇到只需直接返回結(jié)果即可,大大優(yōu)化了時(shí)間捻艳。

5.代碼實(shí)現(xiàn)

public class HouseRobber {
    public int[] result;

    public int rob1(int[] arr){
        result = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            result[i] = -1;
        }
        return solve(arr, arr.length - 1);
    }

    public int solve(int[] arr, int index){
        if (index < 0){
            return 0;
        }
        if (result[index] > 0){
            return result[index];
        }
        result[index] = Math.max(solve(arr, index - 1), solve(arr, index - 2) + arr[index]);
        return result[index];
    }
}

二.LeetCode213.打家劫舍II

1.題目鏈接

https://leetcode-cn.com/problems/house-robber-ii/

2.題目

你是一個(gè)專業(yè)的小偷驾窟,計(jì)劃偷竊沿街的房屋,每間房?jī)?nèi)都藏有一定的現(xiàn)金认轨。這個(gè)地方所有的房屋都圍成一圈绅络,這意味著第一個(gè)房屋和最后一個(gè)房屋是緊挨著的。同時(shí)嘁字,相鄰的房屋裝有相互連通的防盜系統(tǒng)恩急,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警拳锚。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組假栓,計(jì)算你在不觸動(dòng)警報(bào)裝置的情況下,能夠偷竊到的最高金額霍掺。

3.舉例

示例1

輸入: [2,3,2]
輸出: 3
解釋: 你不能先偷竊 1 號(hào)房屋(金額 = 2)匾荆,然后偷竊 3 號(hào)房屋(金額 = 2), 因?yàn)樗麄兪窍噜彽摹?

示例2

輸入: [1,2,3,1]
輸出: 4
解釋: 你可以先偷竊 1 號(hào)房屋(金額 = 1),然后偷竊 3 號(hào)房屋(金額 = 3)杆烁。
     偷竊到的最高金額 = 1 + 3 = 4 牙丽。

4.解題思路

1.打家劫舍II跟LeetCode198.打家劫舍不同的地方在于,第一個(gè)房屋和最后一個(gè)房屋是相鄰的兔魂,那么第一個(gè)房屋和最后一個(gè)房屋不能同時(shí)打劫烤芦,也就是說(shuō)要么從第一家開(kāi)始劫到倒數(shù)第二家,要么從第二家開(kāi)始劫到最后一家析校,分別算出這兩種情況下的最大搶劫金額构罗,然后取更大的就行。
2.從第一家開(kāi)始劫到倒數(shù)第二家智玻,那么從倒數(shù)第二家開(kāi)始往前面劫即可遂唧。從第二家開(kāi)始劫到最后一家這種情況,第一家房屋不太好處理吊奢,那直接把result[0]設(shè)為0盖彭,劫到第一家的時(shí)候直接返回result[0],也就相當(dāng)于沒(méi)有劫第一家。

5.代碼實(shí)現(xiàn)

public class HouseRobber {
    public int[] result;
      
    public int rob2(int[] arr){
        result = new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            result[i] = -1;
        }
        int result1 = solve1(arr, arr.length - 2);
        for (int i = 0; i < arr.length; i++) {
            result[i] = -1;
        }
        result[0] = 0;
        int result2 = solve2(arr, arr.length - 1);
        return result1 >= result2 ? result1 : result2;
    }

    public int solve1(int[] arr, int index){
        if (index < 0){
            return 0;
        }
        if (result[index] > 0){
            return result[index];
        }
        result[index] = Math.max(solve1(arr, index - 1), solve1(arr, index - 2) + arr[index]);
        return result[index];
    }

    public int solve2(int[] arr, int index){
        if (index < 0){
            return 0;
        }
        if (result[index] >= 0){
            return result[index];
        }
        result[index] = Math.max(solve2(arr, index -1), solve2(arr, index - 2) + arr[index]);
        return result[index];
    }
}

參考:
LeetCode 198. 打家劫舍

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末召边,一起剝皮案震驚了整個(gè)濱河市铺呵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧熙,老刑警劉巖片挂,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞盯,死亡現(xiàn)場(chǎng)離奇詭異宴卖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)邻悬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)随闽,“玉大人父丰,你說(shuō)我怎么就攤上這事【蛳埽” “怎么了蛾扇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)魏滚。 經(jīng)常有香客問(wèn)我镀首,道長(zhǎng),這世上最難降的妖魔是什么鼠次? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任更哄,我火速辦了婚禮,結(jié)果婚禮上腥寇,老公的妹妹穿的比我還像新娘成翩。我一直安慰自己,他們只是感情好赦役,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布麻敌。 她就那樣靜靜地躺著,像睡著了一般掂摔。 火紅的嫁衣襯著肌膚如雪术羔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天乙漓,我揣著相機(jī)與錄音级历,去河邊找鬼。 笑死簇秒,一個(gè)胖子當(dāng)著我的面吹牛鱼喉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼扛禽,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼锋边!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起编曼,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豆巨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后掐场,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體往扔,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年熊户,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萍膛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嚷堡,死狀恐怖蝗罗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝌戒,我是刑警寧澤串塑,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站北苟,受9級(jí)特大地震影響桩匪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜友鼻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一傻昙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桃移,春花似錦屋匕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蔗衡,卻和暖如春纤虽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绞惦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工逼纸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人济蝉。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓杰刽,卻偏偏與公主長(zhǎng)得像菠发,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贺嫂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 題目鏈接難度: 簡(jiǎn)單 類型:動(dòng)態(tài)規(guī)劃 你是一個(gè)專業(yè)的小偷滓鸠,計(jì)劃偷竊沿街的房屋。每間房?jī)?nèi)都藏有一定...
    wzNote閱讀 8,340評(píng)論 0 1
  • 題目鏈接:https://leetcode-cn.com/problems/house-robber/descri...
    編程老司機(jī)閱讀 3,063評(píng)論 2 1
  • 原題鏈接:https://leetcode-cn.com/problems/house-robber/ 題目: 你...
    IgorNi閱讀 239評(píng)論 0 0
  • 你是一個(gè)專業(yè)的小偷第喳,計(jì)劃偷竊沿街的房屋糜俗。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連...
    不胖二十斤不改名zz閱讀 376評(píng)論 0 0
  • 你是一個(gè)專業(yè)的小偷曲饱,計(jì)劃偷竊沿街的房屋悠抹。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連...
    小白學(xué)編程閱讀 857評(píng)論 0 0