欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)LeetCode(95.獨(dú)一無(wú)二的二叉搜索樹(shù)之二)

 更新時(shí)間:2021年07月19日 11:28:37   作者:Grandyang  
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(95.獨(dú)一無(wú)二的二叉搜索樹(shù)之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

[LeetCode] 95. Unique Binary Search Trees II 獨(dú)一無(wú)二的二叉搜索樹(shù)之二

Given an integer n, generate all structurally unique BST's (binary search trees) that store values 1 ... n.

Example:

Input: 3
Output:
[
[1,null,3,2],
[3,2,null,1],
[3,1,null,null,2],
[2,1,3],
[1,null,2,null,3]
]
Explanation:
The above output corresponds to the 5 unique BST's shown below:

   1         3     3      2      1
\       /     /      / \      \
3     2     1      1   3      2
/     /       \                 \
2     1         2                 3

這道題是之前的 Unique Binary Search Trees 的延伸,之前那個(gè)只要求算出所有不同的二叉搜索樹(shù)的個(gè)數(shù),這道題讓把那些二叉樹(shù)都建立出來(lái)。這種建樹(shù)問(wèn)題一般來(lái)說(shuō)都是用遞歸來(lái)解,這道題也不例外,劃分左右子樹(shù),遞歸構(gòu)造。這個(gè)其實(shí)是用到了大名鼎鼎的分治法 Divide and Conquer,類似的題目還有之前的那道 Different Ways to Add Parentheses 用的方法一樣,用遞歸來(lái)解,劃分左右兩個(gè)子數(shù)組,遞歸構(gòu)造。剛開(kāi)始時(shí),將區(qū)間 [1, n] 當(dāng)作一個(gè)整體,然后需要將其中的每個(gè)數(shù)字都當(dāng)作根結(jié)點(diǎn),其劃分開(kāi)了左右兩個(gè)子區(qū)間,然后分別調(diào)用遞歸函數(shù),會(huì)得到兩個(gè)結(jié)點(diǎn)數(shù)組,接下來(lái)要做的就是從這兩個(gè)數(shù)組中每次各取一個(gè)結(jié)點(diǎn),當(dāng)作當(dāng)前根結(jié)點(diǎn)的左右子結(jié)點(diǎn),然后將根結(jié)點(diǎn)加入結(jié)果 res 數(shù)組中即可,參見(jiàn)代碼如下:

解法一:

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n == 0) return {};
        return helper(1, n);
    }
    vector<TreeNode*> helper(int start, int end) {
        if (start > end) return {nullptr};
        vector<TreeNode*> res;
        for (int i = start; i <= end; ++i) {
            auto left = helper(start, i - 1), right = helper(i + 1, end);
            for (auto a : left) {
                for (auto b : right) {
                    TreeNode *node = new TreeNode(i);
                    node->left = a;
                    node->right = b;
                    res.push_back(node);
                }
            }
        }
        return res;
    }
};

我們可以使用記憶數(shù)組來(lái)優(yōu)化,保存計(jì)算過(guò)的中間結(jié)果,從而避免重復(fù)計(jì)算。注意這道題的標(biāo)簽有一個(gè)是動(dòng)態(tài)規(guī)劃 Dynamic Programming,其實(shí)帶記憶數(shù)組的遞歸形式就是 DP 的一種,memo[i][j] 表示在區(qū)間 [i, j] 范圍內(nèi)可以生成的所有 BST 的根結(jié)點(diǎn),所以 memo 必須是一個(gè)三維數(shù)組,這樣在遞歸函數(shù)中,就可以去 memo 中查找當(dāng)前的區(qū)間是否已經(jīng)計(jì)算過(guò)了,是的話,直接返回 memo 中的數(shù)組,否則就按之前的方法去計(jì)算,最后計(jì)算好了之后要更新 memo 數(shù)組,參見(jiàn)代碼如下:

解法二:

class Solution {
public:
    vector<TreeNode*> generateTrees(int n) {
        if (n == 0) return {};
        vector<vector<vector<TreeNode*>>> memo(n, vector<vector<TreeNode*>>(n));
        return helper(1, n, memo);
    }
    vector<TreeNode*> helper(int start, int end, vector<vector<vector<TreeNode*>>>& memo) {
        if (start > end) return {nullptr};
        if (!memo[start - 1][end - 1].empty()) return memo[start - 1][end - 1];
        vector<TreeNode*> res;
        for (int i = start; i <= end; ++i) {
            auto left = helper(start, i - 1, memo), right = helper(i + 1, end, memo);
            for (auto a : left) {
                for (auto b : right) {
                    TreeNode *node = new TreeNode(i);
                    node->left = a;
                    node->right = b;
                    res.push_back(node);
                }
            }
        }
        return memo[start - 1][end - 1] = res;
    }
};

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

相關(guān)文章

  • C++貪心算法處理多機(jī)調(diào)度問(wèn)題詳解

    C++貪心算法處理多機(jī)調(diào)度問(wèn)題詳解

    貪心算法(又稱貪婪算法)是指,在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-06-06
  • C語(yǔ)言詳細(xì)講解#error與#line如何使用

    C語(yǔ)言詳細(xì)講解#error與#line如何使用

    這篇文章主要介紹了C語(yǔ)言中#error與#line如何使用,#error與#line雖然在語(yǔ)言里面用的比較少,但是還是有必要了解一下
    2022-04-04
  • Qt中圖片旋轉(zhuǎn)縮放操作的實(shí)現(xiàn)

    Qt中圖片旋轉(zhuǎn)縮放操作的實(shí)現(xiàn)

    本文主要介紹了Qt中圖片旋轉(zhuǎn)縮放操作的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • C語(yǔ)言實(shí)現(xiàn)鏈隊(duì)列基本操作

    C語(yǔ)言實(shí)現(xiàn)鏈隊(duì)列基本操作

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)鏈隊(duì)列基本操作,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • OpenCV實(shí)現(xiàn)輪廓外接多邊形

    OpenCV實(shí)現(xiàn)輪廓外接多邊形

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)輪廓外接多邊形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C語(yǔ)言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對(duì)齊詳解

    C語(yǔ)言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對(duì)齊詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言可變參數(shù)與函數(shù)參數(shù)的內(nèi)存對(duì)齊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法

    Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法

    這篇文章主要介紹了Visual C++程序設(shè)計(jì)中Windows GDI貼圖閃爍的解決方法,分析了GDI貼圖閃爍的常見(jiàn)原因及其具體解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-01-01
  • 淺析c語(yǔ)言中的內(nèi)存

    淺析c語(yǔ)言中的內(nèi)存

    在c++中,內(nèi)存分為5個(gè)區(qū),分別是棧區(qū),堆區(qū),自由存儲(chǔ)區(qū),全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū).
    2017-09-09
  • VScode中C++頭文件問(wèn)題的終極解決方法詳析

    VScode中C++頭文件問(wèn)題的終極解決方法詳析

    最近使用VSCode編譯C/C++時(shí)發(fā)現(xiàn)了問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于VScode中C++頭文件問(wèn)題的終極解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Qt+Quick實(shí)現(xiàn)圖片演示器的開(kāi)發(fā)

    Qt+Quick實(shí)現(xiàn)圖片演示器的開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用Quick實(shí)現(xiàn)圖片演示器的開(kāi)發(fā),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Qt有一定的幫助,需要的可以參考一下
    2023-01-01

最新評(píng)論