色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

數據結構和算法學習筆記(2)

jf_78858299 ? 來源:labuladong ? 作者:labuladong ? 2023-04-06 16:08 ? 次閱讀

三、算法刷題指南

首先要明確的是, 數據結構是工具,算法是通過合適的工具解決特定問題的方法 。也就是說,學習算法之前,最起碼得了解那些常用的數據結構,了解它們的特性和缺陷。

那么該如何在 LeetCode 刷題呢?之前的文章算法學習之路寫過一些,什么按標簽刷,堅持下去云云。現在距那篇文章已經過去將近一年了,我不想說那些不痛不癢的話了,直接說具體的建議:

先刷二叉樹,先刷二叉樹,先刷二叉樹

圖片

這是我這刷題的親身體會,下圖是我從 2018/10 到 2019/10 這一年的心路歷程:

圖片

公眾號文章的閱讀數據顯示,大部分人對數據結構相關的算法文章不感興趣,而是更關心動規回溯分治等等技巧。為什么要先刷二叉樹呢, 因為二叉樹是最容易培養框架思維的,而且大部分算法技巧,本質上都是樹的遍歷問題

刷二叉樹看到題目沒思路?根據很多讀者的問題,其實大家不是沒思路,只是沒有理解我們說的「框架」是什么。 不要小看這幾行破代碼,幾乎所有二叉樹的題目都是一套這個框架就出來了

void traverse(TreeNode root) {
    // 前序遍歷
    traverse(root.left)
    // 中序遍歷
    traverse(root.right)
    // 后序遍歷
}

比如說我隨便拿幾道題的解法出來,不用管具體的代碼邏輯,只要看看框架在其中是如何發揮作用的就行。

LeetCode 124 題,難度 Hard,讓你求二叉樹中最大路徑和,主要代碼如下:

圖片

看出來了嗎,這就是個后序遍歷嘛。

LeetCode 105 題,難度 Medium,讓你根據前序遍歷和中序遍歷的結果還原一棵二叉樹,很經典的問題吧,主要代碼如下:

圖片

不要看這個函數的參數很多,只是為了控制數組索引而已,本質上該算法也就是一個前序遍歷。

LeetCode 99 題,難度 Hard,恢復一棵 BST,主要代碼如下:

圖片

這不就是個中序遍歷嘛,對于一棵 BST 中序遍歷意味著什么,應該不需要解釋了吧。

你看,Hard 難度的題目不過如此,而且還這么有規律可循,只要把框架寫出來,然后往相應的位置加東西就行了,這不就是思路嗎。

剛開始刷二叉樹的題目,前 10 道也許有點難受;結合框架再做 20 道,也許你就有點自己的理解了;刷完整個專題,再去做什么回溯動規分治專題,你就會發現只要涉及遞 歸的問題,都是樹的問題

def coinChange(coins: List[int], amount: int):

    def dp(n):
        if n == 0: return 0
        if n < 0: return -1

        res = float('INF')
        for coin in coins:
            subproblem = dp(n - coin)
            # 子問題無解,跳過
            if subproblem == -1: continue
            res = min(res, 1 + subproblem)
        return res if res != float('INF') else -1

    return dp(amount)

這么多代碼看不懂咋辦?直接提取出框架,就能看出核心思路了:

# 不過是一個 N 叉樹的遍歷問題而已
def dp(n):
    for coin in coins:
        dp(n - coin)

圖片

其實很多動態規劃問題就是在遍歷一棵樹,你如果對樹的遍歷操作爛熟于心,起碼知道怎么把思路轉化成代碼,也知道如何提取別人解法的核心思路。

再看看回溯算法,前文回溯算法詳解干脆直接說了,回溯算法就是個 N 叉樹的前后序遍歷問題,沒有例外。

比如 N 皇后問題吧,主要代碼如下:

void backtrack(int[] nums, LinkedList) {
    if (track.size() == nums.length) {
        res.add(new LinkedList(track));
        return;
    }

    for (int i = 0; i < nums.length; i++) {
        if (track.contains(nums[i]))
            continue;
        track.add(nums[i]);
        // 進入下一層決策樹
        backtrack(nums, track);
        track.removeLast();
    }

/* 提取出 N 叉樹遍歷框架 */
void backtrack(int[] nums, LinkedList) {
    for (int i = 0; i < nums.length; i++) {
        backtrack(nums, track);
}

N 叉樹的遍歷框架,找出來了吧。你說,樹這種結構重不重要?

綜上,對于算法無從下手的朋友來說,可以先刷樹的相關題目,試著從框架上看問題,而不要糾結于細節問題

糾結細節問題,就比如糾結 i 到底應該加到 n 還是加到 n - 1,這個數組的大小到底應該開 n 還是 n + 1 ?

從框架上看問題,就是像我們這樣基于框架進行抽取和擴展,既可以在看別人解法時快速理解核心邏輯,也有助于找到我們自己寫解法時的思路方向。

當然,如果細節出錯,你得不到正確的答案,但是只要有框架,你再錯也錯不到哪去,因為你的方向是對的。

但是,你要是心中沒有框架,那么你根本無法解題,給了你答案,你也不會發現這就是個樹的遍歷問題。

這種思維是很重要的,動態規劃詳解中總結的找狀態轉移方程的幾步流程,有時候按照流程寫出解法,說實話我自己都不知道為啥是對的,反正它就是對了。。。

這就是框架的力量,能夠保證你在快睡著的時候,依然能寫出正確的程序; 就算你啥都不會,都能比別人高一個級別。

四、最后總結

數據結構的基本存儲方式就是鏈式和順序兩種,基本操作就是增刪查改,遍歷方式無非迭代和遞歸。

刷算法題建議從「樹」分類開始刷,結合框架思維,把這幾十道題刷完,對于樹結構的理解應該就到位了。這時候去看回溯、動規、分治等算法專題,對思路的理解可能會更加深刻一些。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 算法
    +關注

    關注

    23

    文章

    4622

    瀏覽量

    93055
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40155
  • 數組
    +關注

    關注

    1

    文章

    417

    瀏覽量

    25979
收藏 人收藏

    評論

    相關推薦

    數據結構算法分析(Java版)(pdf)

    數據結構算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數據結構算法中文第
    發表于 12-20 21:22

    數據結構算法分析

    數據結構算法分析
    發表于 06-05 10:46

    請問學習stm32以及ucos ii ucgui需要學習數據結構算法之類的知識嗎?

    學習stm32以及ucos ii ucgui是否需要學習數據結構算法之類的知識。
    發表于 06-09 23:22

    數據結構教程,下載

    1. 數據結構的基本概念 2. 算法數據結構3. C語言的數據類型及其算法描述要點4.
    發表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數據結構</b>教程,下載

    數據結構算法習題

    數據結構算法習題,ACM專用,刷題初期按照這個地方刷很好
    發表于 03-03 18:25 ?0次下載

    數據結構算法

    全國C語言考試公共基礎知識點——數據結構算法,該資料包含了有關數據結構算法的全部知識點。
    發表于 03-30 14:27 ?0次下載

    數據結構算法分析

    一部淺顯易懂的介紹數據結構算法的書籍。
    發表于 07-14 17:12 ?0次下載

    算法數據結構——接口

    第三章為算法數據結構,本文為3.2.3 接口。
    的頭像 發表于 09-19 17:41 ?8549次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數據結構</b>——接口

    java數據結構學習

    數據結構是對計算機內存中的數據的一種安排,數據結構包括 數組, 鏈表, 棧, 二叉樹, 哈希表等,算法則對對這些結構中的
    發表于 11-29 09:46 ?789次閱讀

    什么是算法?順序結構的定義如何?算法與順序結構的詳細資料概述

    計算機程序=算法數據結構 計算機程序設計=算法數據結構 +程序設計方法學
    發表于 08-30 08:00 ?0次下載
    什么是<b class='flag-5'>算法</b>?順序<b class='flag-5'>結構</b>的定義如何?<b class='flag-5'>算法</b>與順序<b class='flag-5'>結構</b>的詳細資料概述

    為什么要學習數據結構數據結構的應用詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是為什么要學習數據結構數據結構的應用詳細資料概述免費下載包括了:數據結構在串口通信當中的應用,數據結構在按鍵監測
    發表于 09-11 17:15 ?13次下載
    為什么要<b class='flag-5'>學習</b><b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用詳細資料概述免費下載

    什么是數據結構?為什么要學習數據結構數據結構的應用實例分析

    本文檔的主要內容詳細介紹的是什么是數據結構?為什么要學習數據結構數據結構的應用實例分析包括了:數據結構在串口通信當中的應用,
    發表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數據結構</b>?為什么要<b class='flag-5'>學習</b><b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用實例分析

    大牛分享平時如何學習數據結構算法

    數據結構算法的地位對于一個程序員來說不言而喻。今天這篇文章不是來勸你們學習數據結構算法的,也不是來和你們說
    的頭像 發表于 11-02 11:25 ?2990次閱讀

    JavaScrit數據結構算法(第2版)

    JavaScrit數據結構算法(第2版)教材下載。
    發表于 06-01 15:35 ?0次下載

    數據結構算法學習筆記(1)

    首先,這里講的都是普通的數據結構算法,咱不是搞競賽的,野路子出生,只解決常規的問題,以面試為最終目標。另外,以下是我個人的經驗的總結,沒有哪本算法書會寫這些東西,所以請讀者試著理解我的角度,別糾結于細節問題,因為這篇文章就是對
    的頭像 發表于 04-06 16:08 ?541次閱讀
    主站蜘蛛池模板: avtt天堂网2014| 啪啪漫画无遮挡全彩h同人| 中字幕视频在线永久在线| 色多多污版app下载网站| 九九热精品在线| 高中生高潮抽搐喷出白浆视频| 2021国产精品视频| 亚洲精品高清在线观看| 日韩免费一级毛片| 欧美高清vivoesosexo18| 久久久久久电影| 国厂精品114福利电影| 国产99久久九九免费精品无码| jaPanesmature儿母| 最近中文字幕2019国语4 | 亚洲熟妇AV乱码在线观看| 日韩免费精品视频| 暖暖日本免费播放| 久久亚洲精品AV无码四区| 国产呦精品一区二区三区下载| 动漫护士被乳羞羞漫| xxxxxx视频| qvod播放电影| AV天堂AV亚洲啪啪久久无码| 在线视频中文字幕| 亚洲日韩中文字幕区| 迅雷哥在线观看高清| 双性精跪趴灌满h室友4p| 人人澡人人擦人人免费| 末班车动漫无删减免费| 美女全光末满18勿进| 伦理片在线线手机版韩国免费6| 久久国产精品高清一区二区三区| 黑吊大战白女出浆| 含羞草免费完整视频在线观看| 国产色精品VR一区二区| 国产精品永久免费视频| 国产精品久久久久AV麻豆| 国产精品久久久久一区二区三区 | 中文人妻熟妇精品乱又伧| 一本道色综合手机久久|