最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(198.打家劫舍)

 更新時間:2021年08月06日 14:27:43   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(198.打家劫舍),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 198. House Robber 打家劫舍

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.

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.

Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.

Credits:
Special thanks to @ifanchu for adding this problem and creating all test cases. Also thanks to @ts for adding additional test cases.

這道題的本質(zhì)相當(dāng)于在一列數(shù)組中取出一個或多個不相鄰數(shù),使其和最大。那么對于這類求極值的問題首先考慮動態(tài)規(guī)劃 Dynamic Programming 來解,維護一個一位數(shù)組 dp,其中 dp[i] 表示 [0, i] 區(qū)間可以搶奪的最大值,對當(dāng)前i來說,有搶和不搶兩種互斥的選擇,不搶即為 dp[i-1](等價于去掉 nums[i] 只搶 [0, i-1] 區(qū)間最大值),搶即為 dp[i-2] + nums[i](等價于去掉 nums[i-1])。再舉一個簡單的例子來說明一下吧,比如說 nums為{3, 2, 1, 5},那么來看 dp 數(shù)組應(yīng)該是什么樣的,首先 dp[0]=3 沒啥疑問,再看 dp[1] 是多少呢,由于3比2大,所以搶第一個房子的3,當(dāng)前房子的2不搶,則dp[1]=3,那么再來看 dp[2],由于不能搶相鄰的,所以可以用再前面的一個的 dp 值加上當(dāng)前的房間值,和當(dāng)前房間的前面一個 dp 值比較,取較大值當(dāng)做當(dāng)前 dp 值,這樣就可以得到狀態(tài)轉(zhuǎn)移方程 dp[i] = max(num[i] + dp[i - 2], dp[i - 1]), 且需要初始化 dp[0] 和 dp[1],其中 dp[0] 即為 num[0],dp[1] 此時應(yīng)該為 max(num[0], num[1]),代碼如下:

解法一:

class Solution {
public:
    int rob(vector<int>& nums) {
        if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
        vector<int> dp = {nums[0], max(nums[0], nums[1])};
        for (int i = 2; i < nums.size(); ++i) {
            dp.push_back(max(nums[i] + dp[i - 2], dp[i - 1]));
        }
        return dp.back();
    }
};

還有一種解法,核心思想還是用 DP,分別維護兩個變量 robEven 和 robOdd,顧名思義,robEven 就是要搶偶數(shù)位置的房子,robOdd 就是要搶奇數(shù)位置的房子。所以在遍歷房子數(shù)組時,如果是偶數(shù)位置,那么 robEven 就要加上當(dāng)前數(shù)字,然后和 robOdd 比較,取較大的來更新 robEven。這里就看出來了,robEven 組成的值并不是只由偶數(shù)位置的數(shù)字,只是當(dāng)前要搶偶數(shù)位置而已。同理,當(dāng)奇數(shù)位置時,robOdd 加上當(dāng)前數(shù)字和 robEven 比較,取較大值來更新 robOdd,這種按奇偶分別來更新的方法,可以保證組成最大和的數(shù)字不相鄰,最后別忘了在 robEven 和 robOdd 種取較大值返回,代碼如下:

解法二:

class Solution {
public:
    int rob(vector<int>& nums) {
        int robEven = 0, robOdd = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            if (i % 2 == 0) {
                robEven = max(robEven + nums[i], robOdd);
            } else {
                robOdd = max(robEven, robOdd + nums[i]);
            }
        }
        return max(robEven, robOdd);
    }
};

上述方法還可以進(jìn)一步簡潔,我們使用兩個變量 rob 和 notRob,其中 rob 表示搶當(dāng)前的房子,notRob 表示不搶當(dāng)前的房子,那么在遍歷的過程中,先用兩個變量 preRob 和 preNotRob 來分別記錄更新之前的值,由于 rob 是要搶當(dāng)前的房子,那么前一個房子一定不能搶,所以使用 preNotRob 加上當(dāng)前的數(shù)字賦給 rob,然后 notRob 表示不能搶當(dāng)前的房子,那么之前的房子就可以搶也可以不搶,所以將 preRob 和 preNotRob 中的較大值賦給 notRob,參見代碼如下:

解法三:

class Solution {
public:
    int rob(vector<int>& nums) {
        int rob = 0, notRob = 0, n = nums.size();
        for (int i = 0; i < n; ++i) {
            int preRob = rob, preNotRob = notRob;
            rob = preNotRob + nums[i];
            notRob = max(preRob, preNotRob);
        }
        return max(rob, notRob);
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/198

參考資料:

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

https://leetcode.com/problems/house-robber/discuss/55681/java-on-solution-space-o1

https://leetcode.com/problems/house-robber/discuss/55693/c-1ms-o1space-very-simple-solution

https://leetcode.com/problems/house-robber/discuss/55695/java-dp-solution-on-runtime-and-o1-space-with-inline-comment

到此這篇關(guān)于C++實現(xiàn)LeetCode(198.打家劫舍)的文章就介紹到這了,更多相關(guān)C++實現(xiàn)打家劫舍內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++修煉之構(gòu)造函數(shù)與析構(gòu)函數(shù)

    C++修煉之構(gòu)造函數(shù)與析構(gòu)函數(shù)

    本章節(jié)我們將學(xué)習(xí)類的6個默認(rèn)成員函數(shù)中的構(gòu)造函數(shù)與析構(gòu)函數(shù),并對比C語言階段的內(nèi)容來學(xué)習(xí)它們的各自的特性,感興趣的同學(xué)可以參考閱讀
    2023-03-03
  • C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    這篇文章主要介紹了C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符,文章基于C語言展開對主題的詳細(xì)介紹,下文內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • 基于C++中覆蓋,重載,隱藏的一點重要說明

    基于C++中覆蓋,重載,隱藏的一點重要說明

    下面小編就為大家?guī)硪黄贑++中覆蓋,重載,隱藏的一點重要說明。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • memset函數(shù)的使用分析

    memset函數(shù)的使用分析

    本篇文章是對memset函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中十種內(nèi)部排序算法的比較分析

    C++中十種內(nèi)部排序算法的比較分析

    本文給大家分享的是個人寫的一段對C++中十種內(nèi)部排序算法的比較分析的代碼,主要在于測試10種排序方法的性能,給大家參考下吧。
    2015-03-03
  • Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解

    Matlab利用遺傳算法GA求解非連續(xù)函數(shù)問題詳解

    遺傳算法起源于對生物系統(tǒng)所進(jìn)行的計算機模擬研究。其本質(zhì)是一種高效、并行、全局搜索的方法,能在搜索過程中自動獲取和積累有關(guān)搜索空間的知識,并自適應(yīng)地控制搜索過程以求得最佳解。本文將利用其求解非連續(xù)函數(shù)問題,需要的可以參考一下
    2022-09-09
  • C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解

    C語言函數(shù)調(diào)用基礎(chǔ)應(yīng)用詳解

    函數(shù)就是一段封裝好的,可以重復(fù)使用的代碼,它使得我們的程序更加模塊化,不需要編寫大量重復(fù)的代碼。這篇文章主要介紹了c語言是如何處理函數(shù)調(diào)用的?需要的朋友可以參考下
    2023-02-02
  • c++中new的三種用法詳細(xì)解析

    c++中new的三種用法詳細(xì)解析

    以下的是對c++中new的三種使用方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-09-09
  • C++?Boost?Spirit進(jìn)階教程

    C++?Boost?Spirit進(jìn)階教程

    Boost是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標(biāo)準(zhǔn)庫的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C++中多態(tài)的定義及實現(xiàn)詳解

    C++中多態(tài)的定義及實現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于C++中多態(tài)的定義及實現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評論

民和| 鸡东县| 宜州市| 江口县| 潞西市| 威信县| 利川市| 闵行区| 江城| 潼南县| 肥西县| 迁西县| 塘沽区| 丰台区| 临泽县| 观塘区| 上饶县| 永济市| 津市市| 北川| 喜德县| 红桥区| 灌云县| 上思县| 额济纳旗| 罗山县| 隆尧县| 通化县| 大冶市| 武安市| 黄石市| 浦县| 绥棱县| 岳西县| 扶余县| 德惠市| 秦皇岛市| 新野县| 靖江市| 樟树市| 高安市|