House Robber

House Robber 1

https://leetcode.com/problems/house-robber/
給定一個int數(shù)組(正整數(shù))代表每一戶人家的黃金家厌,一個robber泻拦,從第一家開始打家劫舍签舞,不能打劫相鄰的家庭,即打劫了第一家凛剥,下一個智能打劫第三家盆赤。求這個robber最多能打劫多少黃金
Example 1:
Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

解題思路

DP大法从隆,dp[i] 代表在i的位置上能搶到的最大金額。所以果复,i的狀態(tài)轉(zhuǎn)移方程陈莽,是依賴于i-1和i-2的。 對于i的位置虽抄,可以搶走搁,也可以不搶

  • 如果搶了i,那么dp[i] = dp[i-2] + nums[i]
  • 如果不搶i迈窟,那么一定搶過i-1 所以dp[i] = dp[i-1]

所以dp[i] = max(dp[i-2] + nums[i],dp[i-1]);

public int rob(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }

        int size = nums.length;
        int[] dp = new int[size];
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0], nums[1]);
        for (int i = 2; i < size; i++) {
            dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
        }
        return dp[size-1];
    }

House Robber 2

https://leetcode.com/problems/house-robber-ii/
題目1的變種私植,數(shù)組的收尾是相連的,也就是說第一家和最后一家车酣,只能搶其中一家

解析

既然第一家和最后一家只能搶一個曲稼,那就分開算~

  • 先剔除最后一家,算(0~lenth-1)的index范圍內(nèi)的最大值
  • 剔除第一家湖员,算(1~length)的index范圍內(nèi)的最大值
  • 留上面兩個步驟的最大值為最終結(jié)果
    public int rob2(int[] nums) {
        if (nums.length == 0) {
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }
        return Math.max(rob(nums, 0, nums.length - 1), rob(nums, 1, nums.length));
    }

    public int rob(int[] nums, int left, int right) {
        if (right - left <= 1) {
            return nums[left];
        }
        int size = nums.length;
        int[] dp = new int[size];

        dp[left] = nums[left];
        dp[left + 1] = Math.max(nums[left], nums[left + 1]);

        for (int i = left + 2; i < right; i++) {
            dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1]);
        }
        return dp[right - 1];
    }

HouseRobber 3

https://leetcode.com/problems/house-robber-iii/
還是搶劫問題贫悄,把原來的int數(shù)組變成了一個二叉樹,相鄰的節(jié)點不能同時被搶劫

解析

  • 很明確娘摔,這個是需要遞歸來算的~
  • 對于二叉樹root來說窄坦,他的最大值,就是 max(func(root),func(root.left) + func(root.right))
  • 那么func(root)怎么算凳寺,root的值不能與它相鄰的節(jié)點有牽連鸭津,所以只有root.left.right,root.left.left,root.right.left,root.right.right,只有這四個節(jié)點是與它相關(guān)的
    來~ 上代碼
public int rob3(TreeNode root) {
        HashMap<TreeNode, Integer> map = new HashMap<TreeNode, Integer>();
        return rob3DFS(root, map);
    }

    public int rob3DFS(TreeNode root, HashMap<TreeNode, Integer> hash) {
        if (root == null) {
            return 0;
        }

        if (hash.containsKey(root)) {
            return hash.get(root);
        }

        int val = 0;

        //如果root有左子樹肠缨,就找左子樹的最大val逆趋,左子樹是和自己挨著的,所以要從左子樹的兩個子節(jié)點下手
        if (root.left != null) {
            val += rob3DFS(root.left.left, hash) + rob3DFS(root.left.right, hash);
        }

        if (root.right != null) {
            val += rob3DFS(root.right.left, hash) + rob3DFS(root.right.right, hash);
        }

        //root的最大值的求法怜瞒,就是以root為根的最大值 對于  left的最大值+ right的最大值(因為left和right不挨著)
        val = Math.max(val + root.val, rob3DFS(root.left, hash) + rob3DFS(root.right, hash));
        hash.put(root, val);
        return val;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末父泳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吴汪,更是在濱河造成了極大的恐慌惠窄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漾橙,死亡現(xiàn)場離奇詭異杆融,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)霜运,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門脾歇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蒋腮,“玉大人,你說我怎么就攤上這事藕各〕卮荩” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵激况,是天一觀的道長作彤。 經(jīng)常有香客問我,道長乌逐,這世上最難降的妖魔是什么竭讳? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮浙踢,結(jié)果婚禮上绢慢,老公的妹妹穿的比我還像新娘。我一直安慰自己洛波,他們只是感情好胰舆,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奋岁,像睡著了一般思瘟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闻伶,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天滨攻,我揣著相機(jī)與錄音,去河邊找鬼蓝翰。 笑死光绕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的畜份。 我是一名探鬼主播诞帐,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爆雹!你這毒婦竟也來了停蕉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤钙态,失蹤者是張志新(化名)和其女友劉穎慧起,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體册倒,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡蚓挤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灿意。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡估灿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缤剧,到底是詐尸還是另有隱情馅袁,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布荒辕,位于F島的核電站司顿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兄纺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一化漆、第九天 我趴在偏房一處隱蔽的房頂上張望估脆。 院中可真熱鬧,春花似錦座云、人聲如沸疙赠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽圃阳。三九已至,卻和暖如春璧帝,著一層夾襖步出監(jiān)牢的瞬間捍岳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工睬隶, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留锣夹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓苏潜,卻偏偏與公主長得像银萍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恤左,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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