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

    文章

    4612

    浏览量

    92884
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40130
  • 数组
    +关注

    关注

    1

    文章

    417

    浏览量

    25945
收藏 人收藏

    评论

    相关推荐

    数据结构算法分析(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 8535次阅读
    <b class='flag-5'>算法</b>与<b class='flag-5'>数据结构</b>——接口

    java数据结构学习

    数据结构是对计算机内存中的数据的一种安排,数据结构包括 数组, 链表, 栈, 二叉树, 哈希表等,算法则对对这些结构中的
    发表于 11-29 09:46 782次阅读

    什么是算法?顺序结构的定义如何?算法与顺序结构的详细资料概述

    计算机程序=算法数据结构 计算机程序设计=算法数据结构 +程序设计方法学
    发表于 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 2979次阅读

    JavaScrit数据结构算法(第2版)

    JavaScrit数据结构算法(第2版)教材下载。
    发表于 06-01 15:35 0次下载

    数据结构算法学习笔记(1)

    首先,这里讲的都是普通的数据结构算法,咱不是搞竞赛的,野路子出生,只解决常规的问题,以面试为最终目标。另外,以下是我个人的经验的总结,没有哪本算法书会写这些东西,所以请读者试着理解我的角度,别纠结于细节问题,因为这篇文章就是对
    的头像 发表于 04-06 16:08 532次阅读