《算法和数据结构》LeetCode 篇

前言

  "为什么算法这么难?而别人不觉得难”
  “为什么别人能想出来?而我却想不出来”
  “为什么即便我想得出来?也写不出来”
  我也曾迷茫,我也曾失落,但是每当通过自己的意念,理解了一个新的算法以后,之前熬过的苦,瞬间烟消云散,带给我的只有无尽的快乐。
  为什么金字塔尖的人,寥寥无几,凤毛麟角,就是因为他们能,忍常人所不能忍,吃常人所不能吃的苦,才得以成就大业!天下无易成之业,亦无不可成之业,各守乃业则业无不成。

LeetCode算法学习路线


完整版视频地址

  首先让我们看下,我们接下来这段时间,我们需要学习的内容,主要有:

专栏定位适宜人群
「 光天化日学C语言 」「 入门 」没有任何语言基础
「 LeetCode零基础指南 」「 初级 」零基础快速上手力扣
「 C语言入门100例 」「 中级 」零基础持续C语言练习教程
「 算法零基础100讲 」「 高级 」零基础持续算法练习教程
「 画解数据结构 」「 高级 」「 推荐 」 数据结构动图教程
「 算法进阶50讲 」「 资深 」进阶持续算法练习教程
「 LeetCode算法题集汇总 」「 资深 」全面的力扣算法题练习集锦
「 夜深人静写算法 」「 资级 」竞赛高端算法集锦

一、语言基础

1、Hello World

  想上手一门语言,第一步一定是 Hello World。先不要急着配环境,如若环境配了几个时辰,可能起初的雄心壮志,就被配环境的过程消磨殆尽,更加不要谈日后的丰功伟业了。
  要成大事就必争朝夕,让我们直接进入实战。

2、直接实战

  我们直接在力扣上,进行第一段代码的编写,通过这道题,来了解编码的流程,就算你是算法零基础
想必也能看懂。(題目鏈接)
  题目要求我们不要用加号,实现两个数的加法操作,你让我不要用,那我就偏要用,我就是要逆天而行。看!就是这么简单!让我们来复盘一下。

3、及时复盘

  题目要求返回两个整数的和,并且要求不能用 加号,那如果我用了会怎么样,答案是并不会怎么样。因为平台不会对代码做语法分析,只是调用了你的函数,提供一些输入数据,如果输出数据和它给定的相同,就算通过。
  换言之,作为你接触算法的第一道题,其实这些条件,都无所谓,能过就行,对于新人来说,把问题过掉比问题本身更重要,题数的增加是信心的增加。信心比什么都重要,有了信心你才能继续往下走,只要你能往下推进,你就能继续学习,继续学习你迟早会学到相应的算法。
  好了,过了这题以后,把这道题放入你的重刷列表,等你对算法有一定理解以后,再来用题目要求的方法来过掉它。

4、坚持下去

  仅仅做了这一道题是远远不够的,如果不能坚持学习,那么一切美好的愿景都只是海市蜃楼遥不可及。
  现如今,经济飞速发展,我们要知道 “不进则退,慢进也是退” 的道理。只有当你采取快速高效的行动之后,才能够在残酷的竞争中,拥有自己的一席之地!
  有志者事竟成,破釜沉舟,百二秦关终属楚!
  苦心人天不负,卧薪尝胆,三千越甲可吞吴!
  始终相信 长风破浪会有时,直挂云帆济沧海!

5、养成习惯

  单纯学习语言未免太过枯燥乏味,所以建议一边学习一遍刷题,养成每天刷题的习惯,在刷题的过程中巩固语法,每过一个题相当于是一次正反馈,能够让你在刷题旅途中酣畅淋漓,从而更好的保证你一直坚持下去,在没有任何算法基础的情况下,可以按照我提供的专栏来刷题,这也是上上个视频提到的 九日集训 的完整教材,主要有以下几个内容:

  这个专栏主要讲解了一些 LeetCode 刷题时的一些难点和要点,主要分为以下几个章节,并且会持续补充一些方法论的文章。文章有试读,可以简单先看一看试读文章。

🍠《LeetCode零基础指南》🍠

导读
(第一讲)函数
(第二讲)循环
(第三讲)数组
(第四讲)指针
(第五讲)排序
(第六讲)贪心
(第七讲)矩阵
(第八讲)二级指针
(第九讲)简单递归

6、九日集训

  「 九日集训 」是博主推出的一个能够白嫖付费专栏「 LeetCode零基础指南 」的活动。通过 「 专栏中的联系方式 」 或者 「 本文末尾的联系方式 」 联系博主,进行报名即可参加。九日一个循环,第二期计划 「 2021.12.02 」 开启。

  玩法很简单,每天会开启一篇试读文章,要求有三点:
  1)阅读完文章后,课后习题 「 全部刷完 」(都能在文中找到解法,需要自己敲一遍代码);
  2)写 「 学习报告 」 并发布社区 九日集训(每日打卡) 频道
  3)在 「 打卡帖 」 提交 「 学习报告 」 链接;

  完成以上三点后方可晋级到下一天,所有坚持到 9天 的同学,会成为 「 英雄算法联盟合伙人 」 群成员,只限500个名额,优胜劣汰,和精英在一起,无论是沟通,学习,都能有更好的发展,你接触到的人脉也都是不一样的,等找工作的时候,我也会为大家打通 hr 和猎头,让你前程无忧~
  详细规则参见:九日集训规则详解
  目前第一轮「 九日集训 」已经进行到第七天,即将开启第二轮。

二、数学基础

  LeetCode上的题目相比ACM来说,数学题较少,所以对数学有恐惧的同学也不必担心,比较常见的数学题主要有:位运算,线性代数,计算几何,组合数学 ,数论,概率论。
在这里插入图片描述

板块题数
位运算30
线性代数20
计算几何5
组合数学5
数论5
概率论5

1、位运算

  位运算主要有:位与、位或、按位取反、异或、左移 和 右移。对应的文章可以看:

(第42讲) 位运算 (位与) 入门
(第44讲) 位运算 (位或) 入门
(第46讲) 位运算 (异或) 入门
(第48讲) 位运算 (左移) 入门
(第49讲) 位运算 (右移) 入门
(第50讲) 位运算 (取反) 入门

  位运算是计算机的精华所在,是必须掌握的内容。大概每个运算操作刷 三 到 五 题就基本有感觉了。

2、线性代数

  线性代数在刷题中,主要内容有 矩阵运算高斯消元。矩阵在程序中的抽象就是二维数组。如下:

(第七讲)矩阵

  高斯消元是求解多元一次方程组的,一般在竞赛中会遇到,面试一般不问,因为面试官可能也不会。

夜深人静写算法 (十六) 高斯消元

3、计算几何

  数论 是 ACM 中一个比较重要的内容,至少一旦出现,一定不会是一个水题,编码量较大,但是在 LeetCode 中题型较少,可以适当掌握一些基础内容即可。对应文章如下:

夜深人静写算法 (四)- 计算几何入门
夜夜深人静写算法(十二)- 凸包

4、数论

  数论 是 ACM 中一个比较重要的内容,但是在 LeetCode 中题型较少,可以适当掌握一些基础内容即可。对应文章如下:

夜深人静写算法 (三) 初等数论入门

5、组合数学 和 概率论

  组合数学 和 概率论,在 LeetCode 中题目较少,有兴趣可以刷一刷,没有兴趣就不要去刷了,毕竟兴趣才是最好的老师。对应的文章如下:

(第4讲) 组合数
(第30讲) 概率问题

三、数据结构

  任何一种数据结构,都可以认为是一个容器,你可以让往里面添加元素,也可以从里面移除元素,也可以将某个元素的属性进行改变,还可以查询某个元素的属性。所以,它无非就是 增、删、改、查。
  每一种数据结构都不是完美的,我们要做的,就是尽量减少 增、删、改、查 的 时间复杂度 和 空间复杂度。LeetCode 题中涉及到的数据结构主要分为:线性表、哈希表(也叫散列表)、树、图、树状数组。
  以下是每个数据结构建议刷的题数(不要被数字吓到,实际刷下来很多内容是重复的,比如一个问题既可以用数组做,可以用链表做):

板块题数
数组100
字符串50
链表50
50
队列50
哈希表50
二叉树/二叉搜索树30
字典树20
10
线段树10
并查集10
树状数组10
AVL树/红黑树5
霍夫曼树1

  接下来,就由我来为大家一一介绍:

1、线性表

  线性表主要有 数组、字符串、链表、队列、栈。

1)数组

  数组是数学中数列的抽象,在程序中的存储空间是连续的,数组和字符串相关的题多如牛毛。属于数据结构中最简单的内容,和数组相关的算法也层次不齐,主要是枚举,即遍历数组然后执行相关操作,大部分都较为简单,建议刷满 100 题。

《画解数据结构》顺序表

2)字符串

  字符串则是一种特殊的数组,即字符数组,字符串相关的算法主要有 字典树,KMP,前缀自动机,后缀树组,难度依次递增,建议先学习 字典树,很好理解,等力扣题刷满 500 题以后再来学习剩下几个算法也为时不晚,字符串的题建议刷满 50 题。

(第21讲) 字符串算法(一) - 字符串遍历
(第22讲) 字符串算法(二) - 字符串比较
(第23讲) 字符串算法(三) - 字符串分割
(第24讲) 字符串算法(四) - 字符计数法
(第25讲) 字符串算法(五) - 字符串反转
(第26讲) 字符串算法(六) - 回文串
(第27讲) 字符串算法(七) - 高精度

3)链表

  链表和数组是一个对立概念。数组是顺序存储的,链表是链式存储的,也就是链表元素的 前驱 和 后继 在实际存储空间上,是不一定连续的。链表分为 单向链表 和 双向链表,理解链表以后,就对数据结构有一个更加清晰的认识了,链表的题建议刷满 50 题。

《画解数据结构》链表

4)栈

  栈是一种先进后出的数据结构,可以用数组或者链表来实现,主要应用就是将 递归转化成迭代,表达式求值就是典型的栈的实现。配合深度优先搜索使用,栈的题建议刷满 50题。

《画解数据结构》栈

5)队列

  队列是一种先进先出的数据结构,可以用数组或者链表来实现。主要应用就是 消息队列,配合广度优先搜索使用,在实际编码过程应用比较广泛。队列主要有:先进先出队列,双端队列,循环队列,单调队列。队列的题建议刷满 50 题。

《画解数据结构》队列

2、哈希表

  哈希表也叫散列表。它是一种 插入 和 查询 都是 O ( 1 ) O(1) O(1) 的数据结构。唯一的缺点是它是无序的,哈希表的用途非常广泛,无论是搜索还是动态规划,都会借用到哈希的思想。
  Python 中的 dict,Lua 中的 table,C++ 中的 unorderd_map,redis 中的 字典,都是由哈希表来实现的,哈希表的题建议刷满 50 题。

《画解数据结构》哈希表

3、树

  树 主要有 二叉树,二叉搜索树,堆,线段树,平衡二叉树,红黑树,字典树,霍夫曼树。重要性依次递减。

1)二叉树和二叉搜索树

  刷树相关的题之前,建议先对递归有一个比较深入的了解,二叉树的遍历用到了深度优先搜索。建议重点掌握,二叉树和二叉搜索树的题建议刷满 30 题。

《画解数据结构》二叉树
《画解数据结构》二叉搜索树

2)堆

  堆也叫优先队列,是一种完全二叉树。是一种 增删 O ( l o g 2 n ) O(log_2n) O(log2n),查询最值 O ( 1 ) O(1) O(1) 的数据结构。可以用 C++ 中的 priority_queue。
  建议刷 10 题掌握其用法。

《画解数据结构》堆

3)线段树

  线段树用到了分治思想,典型的问题是区间最值。属于较难内容,面试考点也较少。建议刷 10 题掌握其思想。

4)AVL 树 和 红黑树

  平衡二叉树主要有 红黑树 和 AVL 树。STL 中的 map / set 就是一棵平衡二叉树,和哈希表的功能类似,任何用哈希表的题都可以用它来过掉。面试的时候会问一些 红黑树 和 AVL树 的基础概念。

《画解数据结构》AVL 树

5)字典树

  字典树主要做字符串的前缀匹配,相对较容易理解,大部分用哈希表的题都可以用字典树求解,建议刷 20 题巩固概念。

6)霍夫曼树

  霍夫曼树主要用于霍夫曼编码,是一种前缀编码,题型不多,了解即可。

夜深人静写算法(十五)- 霍夫曼编码

7)并查集

  并查集是一种利用数组实现的森林数据结构,建议刷 10 题了解概念即可。

夜深人静写算法(五)- 并查集

4、图

  图主要分为有向图和无向图,还有一些特殊的图比如二分图。图主要对应遍历算法,即 广度优先搜索 和 深度优先搜索,后面讲常用算法的时候会提到。

5、树状数组

  树状数组是一种数组的结构,但是数组元素之间有树形链接关系,它主要用于:单点更新,成段求和。由于实现简单,比线段树的常数时间复杂度低,建议刷 10 题了解一下概念。

夜深人静写算法(十三)- 树状数组

五、常用算法

  基础的算法主要分为:枚举、排序、贪心、搜索、动态规划。
在这里插入图片描述

板块题数
一维枚举30
双指针30
二分枚举30
前缀和20
二维枚举10

1、枚举

  枚举就是我们通常所说的暴力算法,主要有:一维枚举、多维枚举、前缀和、双指针、二分查找。

1)一维枚举

  一维枚举就是一个循环,题目较多,一般配合 数组 或者 链表 这两种数据结构进行求解。建议刷 30 题。

(第17讲) 线性枚举(一)
(第18讲) 线性枚举(二)

2)多维枚举

  多维枚举就是多个循环嵌套。建议刷题数为 10题。

(第31讲) 多维枚举(一)
(第32讲) 多维枚举(二)

3)前缀和

  前缀和就是利用预处理将数组的前缀求和存储下来,并且在下次计算的时候利用减法在 O ( 1 ) O(1) O(1) 的时间求解,是一个预处理算法,技巧性较强,建议刷 20 题左右。

(第57讲) 前缀和(一) 线性前缀和入门
(第58讲) 前缀和(二) 线性前缀和变形
(第59讲) 前缀和(三) 线性前缀和统计

4)双指针

  利用问题的单调性,将原本 O ( n 2 ) O(n^2) O(n2) 的算法转换成 O ( n ) O(n) O(n)。利用双指针的题很容易就能看出来,一般是数列,并且 n n n 都在 1 0 6 10^6 106 左右。双指针是面试的热门考点,必须掌握,建议刷 30 题巩固算法。

夜深人静写算法(二十八)- 双指针

5)二分查找

  利用问题的单调性,将原本 O ( n ) O(n) O(n) 的算法转换成 O ( l o g 2 n ) O(log_2n) O(log2n),是一种经典的对数级别的时间复杂度算法。和双指针一样,属于必须掌握的内容,建议刷 30 题巩固算法。

夜深人静写算法(四十二)- 二分查找

2、排序

  对于排序,已经有太多人讲解它了,重要性也不言而喻。建议了解每个排序的算法实现原理,并且自己动手写一下,目的是为了提升思维。排序的题建议刷 100 题。

「冒泡排序」算法教程
「选择排序」算法教程
「插入排序」算法教程
「希尔排序」算法教程
「归并排序」算法教程
「快速排序」算法教程
「计数排序」算法教程
「基数排序」算法教程

3、贪心

  贪心是一种很神奇的算法,需要有大量习题总结归纳,一直没有很好的文章输出,我尽力写一篇。很多贪心都是先排序然后再贪心,所以跟着排序专题一起刷。

(第六讲) 贪心

4、搜索

  搜索主要分为 广度优先搜索深度优先搜索。广度优先搜索主要用于求解最短路问题,深度优先搜索主要用于求解穷举,遍历类问题。建议各刷 100 题。

板块题数
深度优先搜索100
广度优先搜索100
夜深人静写算法(一)- 深度优先搜索
夜深人静写算法(十)- 广度优先搜索

5、动态规划

  动态规划又叫DP,入门时建议先刷 一维DP 的题。详情请见:画解动态规划,动态规划建议 300 题起步。

六、杂项算法

  杂项算法比较杂,列出来看看吧,刷不刷也无所谓啦,反正很偏,喜欢就刷去吧!主要有 状态压缩,高精度,离散化,模拟,博弈,随机算法,采样算法,闹经急转弯,交互类问题。

七、算法专栏推荐

专栏定位适宜人群
「 光天化日学C语言 」「 入门 」没有任何语言基础
「 LeetCode零基础指南 」「 初级 」零基础快速上手力扣
「 C语言入门100例 」「 中级 」零基础持续C语言练习教程
「 算法零基础100讲 」「 高级 」零基础持续算法练习教程
「 画解数据结构 」「 高级 」「 推荐 」 数据结构动图教程
「 算法进阶50讲 」「 资深 」进阶持续算法练习教程
「 LeetCode算法题集汇总 」「 资深 」全面的力扣算法题练习集锦
「 夜深人静写算法 」「 资级 」竞赛高端算法集锦

八、配套福利赠送

语言入门《光天化日学C语言》(示例代码)
语言训练《C语言入门100例》试用版
数据结构《画解数据结构》源码
算法入门《算法入门》指引
算法进阶《夜深人静写算法》算法模板

👇🏻 添加 博主 参加 九日集训👇🏻
  • 111
    点赞
  • 380
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值