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

C++實(shí)現(xiàn)LeetCode(120.三角形)

 更新時(shí)間:2021年07月23日 17:11:43   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(120.三角形),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 120.Triangle 三角形

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

這道題給了我們一個(gè)二維數(shù)組組成的三角形,讓我們尋找一條自上而下的路徑,使得路徑和最短。那么那道題后還是先考慮下暴力破解,我們可以發(fā)現(xiàn)如果要遍歷所有的路徑的話,那可以是階乘級(jí)的時(shí)間復(fù)雜度啊,OJ必滅之,趁早斷了念想比較好。必須要優(yōu)化時(shí)間復(fù)雜度啊,題目中給的例子很容易把人帶偏,讓人誤以為貪婪算法可以解題,因?yàn)榭搭}例子中的紅色數(shù)組,在根數(shù)字2的下方選小的數(shù)字3,在3的下方選小的數(shù)字5,在5的下方選小的數(shù)字1,每次只要選下一層相鄰的兩個(gè)數(shù)字中較小的一個(gè),似乎就能得到答案了。其實(shí)是不對(duì)的,貪婪算法可以帶到了局部最小,但不能保證每次都帶到全局最小,很有可能在其他的分支的底層的數(shù)字突然變的超級(jí)小,但是貪婪算法已經(jīng)將其他所有分支剪掉了。所以為了保證我們能得到全局最小,動(dòng)態(tài)規(guī)劃Dynamic Programming還是不二之選啊。其實(shí)這道題和 Dungeon Game 非常的類似,都是用DP來(lái)求解的問(wèn)題。那么其實(shí)我們可以不新建dp數(shù)組,而是直接復(fù)用triangle數(shù)組,我們希望一層一層的累加下來(lái),從而使得 triangle[i][j] 是從最頂層到 (i, j) 位置的最小路徑和,那么我們?nèi)绾蔚玫綘顟B(tài)轉(zhuǎn)移方程呢?其實(shí)也不難,因?yàn)槊總€(gè)結(jié)點(diǎn)能往下走的只有跟它相鄰的兩個(gè)數(shù)字,那么每個(gè)位置 (i, j) 也就只能從上層跟它相鄰的兩個(gè)位置過(guò)來(lái),也就是 (i-1, j-1) 和 (i-1, j) 這兩個(gè)位置,那么狀態(tài)轉(zhuǎn)移方程為:

triangle[i][j] = min(triangle[i - 1][j - 1], triangle[i - 1][j])

我們從第二行開(kāi)始更新,注意兩邊的數(shù)字直接賦值上一行的邊界值,那么最終我們只要在最底層找出值最小的數(shù)字,就是全局最小的路徑和啦,代碼如下:

解法一:

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        for (int i = 1; i < triangle.size(); ++i) {
            for (int j = 0; j < triangle[i].size(); ++j) {
                if (j == 0) {
                    triangle[i][j] += triangle[i - 1][j];
                } else if (j == triangle[i].size() - 1) {
                    triangle[i][j] += triangle[i - 1][j - 1];
                } else {
                    triangle[i][j] += min(triangle[i - 1][j - 1], triangle[i - 1][j]);
                }
            }
        }
        return *min_element(triangle.back().begin(), triangle.back().end());
    }
};

這種方法可以通過(guò)OJ,但是畢竟修改了原始數(shù)組triangle,并不是很理想的方法。在網(wǎng)上搜到一種更好的DP方法,這種方法復(fù)制了三角形最后一行,作為用來(lái)更新的一位數(shù)組。然后逐個(gè)遍歷這個(gè)DP數(shù)組,對(duì)于每個(gè)數(shù)字,和它之后的元素比較選擇較小的再加上面一行相鄰位置的元素做為新的元素,然后一層一層的向上掃描,整個(gè)過(guò)程和冒泡排序的原理差不多,最后最小的元素都冒到前面,第一個(gè)元素即為所求。代碼如下:

解法二: 

class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        vector<int> dp(triangle.back());
        for (int i = (int)triangle.size() - 2; i >= 0; --i) {
            for (int j = 0; j <= i; ++j) {
                dp[j] = min(dp[j], dp[j + 1]) + triangle[i][j];
            }
        }
        return dp[0];
    }
};

下面我們來(lái)看一個(gè)例子,對(duì)于輸入數(shù)組:

     -1

    2   3

  1  -1  -3

5   3   -1   2

下面我們來(lái)看DP數(shù)組的變換過(guò)程(紅色數(shù)字為每次dp數(shù)組中值改變的位置):

DP:5  3  -1  2

DP:4  3  -1  2

DP:4  -2  -1  2

DP:4  -2  -4  2

DP:0  -2  -4  2

DP:0  -1  -4  2

DP:-2  -1  -4  2

參考資料:

https://leetcode.com/problems/triangle/

https://leetcode.com/problems/triangle/discuss/38730/DP-Solution-for-Triangle

https://leetcode.com/problems/triangle/discuss/38918/C%2B%2B-top-down-and-bottom-up-solutions.

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

相關(guān)文章

  • C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法

    C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言字符串原地壓縮實(shí)現(xiàn)方法,包含了字符串的遍歷與轉(zhuǎn)換等操作,是很實(shí)用的操作技巧,需要的朋友可以參考下
    2014-09-09
  • C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能

    C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言利用數(shù)組和文件實(shí)現(xiàn)登錄注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • C++語(yǔ)法中的函數(shù)重載和默認(rèn)參數(shù)

    C++語(yǔ)法中的函數(shù)重載和默認(rèn)參數(shù)

    這篇文章主要介紹了C++語(yǔ)法中的函數(shù)重載和默認(rèn)參數(shù),本文從語(yǔ)法角度通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼

    C++實(shí)現(xiàn)自定義撤銷重做功能的示例代碼

    在使用c++做界面開(kāi)發(fā)的時(shí)候,尤其是實(shí)現(xiàn)白板功能時(shí)需要自己實(shí)現(xiàn)一套撤銷重做功能.如果是qt則有QUndoable對(duì)象,可以直接拿來(lái)用。但是如果是使用gdi繪圖,則可能需要自己實(shí)現(xiàn)了。本文就來(lái)用C++實(shí)現(xiàn)自定義撤銷重做功能,需要的可以參考一下
    2022-12-12
  • C語(yǔ)言如何實(shí)現(xiàn)BOOL類型

    C語(yǔ)言如何實(shí)現(xiàn)BOOL類型

    這篇文章主要介紹了C語(yǔ)言如何實(shí)現(xiàn)BOOL類型問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++語(yǔ)言const 關(guān)鍵字使用方法圖文詳解

    C++語(yǔ)言const 關(guān)鍵字使用方法圖文詳解

    在類中,如果你不希望某些數(shù)據(jù)被修改,可以使用const關(guān)鍵字加以限定。const 可以用來(lái)修飾成員變量、成員函數(shù)以及對(duì)象
    2020-01-01
  • C++11中delete和default的用法詳解

    C++11中delete和default的用法詳解

    這篇文章主要為大家詳細(xì)介紹了C++11中delete和default的具體用法,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下
    2023-08-08
  • C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • opencv實(shí)現(xiàn)視場(chǎng)轉(zhuǎn)換

    opencv實(shí)現(xiàn)視場(chǎng)轉(zhuǎn)換

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)視場(chǎng)轉(zhuǎn)換,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • MFC擴(kuò)展DLL中導(dǎo)出類和對(duì)話框的實(shí)現(xiàn)方法

    MFC擴(kuò)展DLL中導(dǎo)出類和對(duì)話框的實(shí)現(xiàn)方法

    這篇文章主要介紹了MFC擴(kuò)展DLL中導(dǎo)出類和對(duì)話框的實(shí)現(xiàn)方法,詳細(xì)講述了實(shí)現(xiàn)擴(kuò)展DLL中導(dǎo)出類和對(duì)話框的具體步驟與方法,具有不錯(cuò)的實(shí)用價(jià)值,需要的朋友可以參考下
    2014-10-10

最新評(píng)論

寿宁县| 玉环县| 拜城县| 武城县| 永丰县| 沂源县| 郓城县| 砀山县| 育儿| 普安县| 新密市| 团风县| 海安县| 原平市| 高台县| 犍为县| 基隆市| 长泰县| 乐山市| 安徽省| 南康市| 湖南省| 五台县| 浮梁县| 石首市| 淮阳县| 澳门| 阳朔县| 上虞市| 临西县| 当阳市| 苏州市| 镇康县| 毕节市| 武鸣县| 亳州市| 修水县| 海盐县| 图们市| 宁远县| 孟津县|