国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

[Leetcode] House Robber 打家劫舍

golden_hamster / 3480人閱讀

摘要:動(dòng)態(tài)規(guī)劃復(fù)雜度時(shí)間空間思路一般來(lái)說(shuō),給定一個(gè)規(guī)則,讓我們求任意狀態(tài)下的解,都是用動(dòng)態(tài)規(guī)劃。另外我們可以做一點(diǎn)優(yōu)化,本來(lái)我們是要用一個(gè)數(shù)組來(lái)保存之前的結(jié)果的。所以我們分別算出這兩個(gè)條件下的最大收益,然后取更大的就行了。可以復(fù)用的代碼。

House Robber I

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

動(dòng)態(tài)規(guī)劃 復(fù)雜度

時(shí)間 O(N) 空間 O(1)

思路

一般來(lái)說(shuō),給定一個(gè)規(guī)則,讓我們求任意狀態(tài)下的解,都是用動(dòng)態(tài)規(guī)劃。這里的規(guī)則是劫匪不能同時(shí)搶劫相鄰的屋子,即我們?cè)诶奂訒r(shí),只有兩種選擇:

如果選擇了搶劫上一個(gè)屋子,那么就不能搶劫當(dāng)前的屋子,所以最大收益就是搶劫上一個(gè)屋子的收益

如果選擇搶劫當(dāng)前屋子,就不能搶劫上一個(gè)屋子,所以最大收益是到上一個(gè)屋子的上一個(gè)屋子為止的最大收益,加上當(dāng)前屋子里有的錢(qián)

所以,我們只要判斷一下兩個(gè)里面哪個(gè)大就行了,同時(shí)也是我們的遞推式。另外我們可以做一點(diǎn)優(yōu)化,本來(lái)我們是要用一個(gè)dp數(shù)組來(lái)保存之前的結(jié)果的。但實(shí)際上我們只需要上一次和上上次的結(jié)果,所以可以用兩個(gè)變量就行了。

代碼
public class Solution {
    public int rob(int[] nums) {
        if(nums.length <= 1){
            return nums.length == 0 ? 0 : nums[0];
        }
        // a是上次的最大收益
        int a = nums[0];
        // b是當(dāng)前的最大受益
        int b = Math.max(nums[0], nums[1]);
        for(int i = 2; i < nums.length; i++){
            int tmp = b;
            // 當(dāng)前的最大收益是兩種選擇里較大的那個(gè)
            b = Math.max(a + nums[i], b);
            a = tmp;
        }
        return b;
    }
}
House Robber II 動(dòng)態(tài)規(guī)劃 復(fù)雜度

時(shí)間 O(N) 空間 O(1)

思路

和I一樣,但是這里多了一條規(guī)則,抽象出來(lái)就是:搶劫第一個(gè)屋子就不能搶劫最后一個(gè)屋子,搶劫最后一個(gè)屋子就不能搶劫第一個(gè)屋子。所以我們分別算出這兩個(gè)條件下的最大收益,然后取更大的就行了。可以復(fù)用I的代碼。

代碼
public class Solution {
    
    public int rob(int[] nums) {
        // 求兩種條件下更大的那個(gè),用一個(gè)offset表示是哪種條件
        return Math.max(rob(nums, 0), rob(nums, 1));
    }
    
    public int rob(int[] nums, int offset) {
        // 如果長(zhǎng)度過(guò)小,則直接返回結(jié)果
        if(nums.length <= 1 + offset){
            return nums.length <= offset ? 0 : nums[0 + offset]; 
        }
        int a = nums[0 + offset];
        // 如果offset是1,則從下標(biāo)為1的元素開(kāi)始計(jì)算,所以要比較nums[1]和nums[2]
        int b = Math.max(nums[0 + offset], nums[1 + offset]);
        // 對(duì)于不搶劫最后一個(gè)房子的情況,i要小于nums.length - 1
        for(int i = 2 + offset; i < nums.length - 1 + offset; i++){
            int tmp = b;
            b = Math.max(a + nums[i], b);
            a = tmp;
        }
        return b;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64613.html

相關(guān)文章

  • LeetCode 攻略 - 2019 年 7 月上半月匯總(55 題攻略)

    摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言?xún)?nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱(chēng)和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...

    warmcheng 評(píng)論0 收藏0
  • leetcode198,213 house robber

    摘要:你不能連著偷兩家因?yàn)檫@樣會(huì)觸發(fā)警報(bào)系統(tǒng)。現(xiàn)在有一個(gè)數(shù)組存放著每一家中的可偷金額,問(wèn)可以偷的最大金額為多少這里考驗(yàn)了動(dòng)態(tài)編程的思想。動(dòng)態(tài)編程要求我們將問(wèn)題一般化,然后再找到初始情況開(kāi)始這個(gè)由一般到特殊的計(jì)算過(guò)程。 House Robber I You are a professional robber planning to rob houses along a street. Each...

    whidy 評(píng)論0 收藏0
  • [LeetCode] House Robber I II

    摘要:注意對(duì)邊界條件的判斷,是否非空,是否長(zhǎng)度為 House Robber I Problem You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping y...

    qpal 評(píng)論0 收藏0
  • LeetCode[337] House Robber III

    摘要:復(fù)雜度思路對(duì)于每一個(gè)位置來(lái)說(shuō),考慮兩種情況分別對(duì)和再進(jìn)行計(jì)算。用對(duì)已經(jīng)計(jì)算過(guò)的進(jìn)行保留,避免重復(fù)計(jì)算。 LeetCode[337] House Robber III The thief has found himself a new place for his thievery again. There is only one entrance to this area, calle...

    Dr_Noooo 評(píng)論0 收藏0
  • [LintCode/LeetCode] House Robber II

    摘要:因?yàn)槿×岁?duì)首就不能取隊(duì)尾,所以對(duì)數(shù)組循環(huán)兩次,一個(gè)從取到,一個(gè)從取到,比較兩次循環(huán)后隊(duì)尾元素,取較大者。注意,要先討論當(dāng)原數(shù)組位數(shù)小于時(shí)的情況。 Problem After robbing those houses on that street, the thief has found himself a new place for his thievery so that he wi...

    OnlyLing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<