大学四年,从小白到大神,全网最硬核算法学习攻略,不接受反驳-程序员宅基地

技术标签: 算法  学习  Python赚钱  python  Python兼职  开发语言  

一道题做半天,另外半天看这道题的题解,一台电脑一包烟,一道题解整一天,是我智商有问题吗? 刷了两年题之后,我可以负责任跟你说,刷题吃力很正常,学算法,刷 leetcode 不是一朝一夕的事情,需要一个过程。

而且新手学算法,还很容易陷入一些误区,例如一上来就 抱着《算法导论》这种天书,啥数据结构还没学,就去刷 leetcode,这其实不好,只会让自己放弃算法。

学习算法,应该要一步一步来,要有规划,下面给大家分享下我的算法学习经验吧,觉得有帮助给我点个赞就行了。

一、刷题前的一些准备

如果你连最基本的数据结构,例如链表,队列,栈,二叉树都没有接触过,那么我是不建议你去 leetcode 刷题的,所以我上面先说了先入门一下数据结构与算法,当你学习了这些基础的数据结构之后,其实已经具备了刷题的能力了。

一、基础数据结构与算法知识

1、时间复杂度

2、空间复杂度

一般最先接触的就是时间复杂度和空间复杂度的学习了,这两个概念以及如何计算,是必须学的,也是必须最先学的,主要有最大复杂度、平均复杂度等,直接通过博客搜索学习即可。

3、线性表

  • 列表(必学)
  • 链表(必学)
  • 跳跃表(知道原理,应用,最后自己实现一遍)
  • 并查集(建议结合刷题学习)

不用说,链表、列表必须,不过重点是链表。

4、栈与队列

  • 栈(必学)
  • 队列(必学)
  • 优先队列、堆(必学)
  • 多级反馈队列(原理与应用)

4、树

  • 二叉树:各种遍历(递归与非递归)(必学)
  • 哈夫曼树与编码(原理与应用)
  • AVL树(必学)
  • B 树与 B+ 树(原理与应用)
  • 前缀树(原理与应用)
  • 红黑树(原理与应用)
  • 线段树(原理与应用)

树相关是知识还是挺多的,建议看书,可以看《算法第四版》

不过刷题前也不需要准备这么多,先把最基本的二叉树学了就可以了

二、常见算法思想

Leetcode 刷题我还是希望你能在学习一些算法思想,一般就这几种

1、递归

2、枚举

3、贪心

4、回溯

5、动态规划

但是,其中最重要的,我觉得就是递归,其他的几种算法,也都会有递归的影子,并且我刚才说图相关算法、二叉树的遍历等,也都包含递归的使用。

所以,在你刷题之前,或者在学习二叉树、图相关算法遇到递归的时候,我希望你能静下心来,去学一学递归,我也会告诉你,对于初学者,递归很难,我是被无数次折腾,无数次看答案似懂非懂之后,才突然醒悟了。

你不需要把它学的很精通,但是你要懂一些基本的递归题,知道递归是怎么一回事,例如最简单的斐波那契数列得会用递归做吧?阶乘也会吧(虽然不是最优解)。

所以,死磕入门数据结构,可以学习下一些算法思想,而递归,你必须得入门,至于动态规划、回溯,我觉得慢点学也没有,可以后面刷题遇到时在学,而枚举、贪心,相对比较简单。

二、如何刷题

终于,到了刷题这一部分了,如果要说学算法的捷径,那么刷题便是最好的捷径,如果你刷的题很少,达不到一定的量,那么再多的捷径,估计也没啥用,只有在满足一定题量的情况下,才适合来谈论所谓的技巧

1、先说一说互联网算法笔试

不过在刷题之前我想先说一说笔试,如果笔试不考算法,面试也不考算法,那么我可能在学习算法的这条路上,会少了很多的积极性,你可能会觉得我很功利,但是我觉得,带着功利性的目的去学习算法,也是完全没问题的。

在校招的笔试中,其实这些笔试题还是挺难的,你在 leectode 可以做出 hard 级别的题,但在笔试中,可能连 medium 级别的都做不出,因为笔试的题,都比较灵活,基本都会通过实际的例子来引出一道题,你可能不知道要使用哪种方法来做比较好,有些还是多种方法的结合。

对于笔试的题型,我之前也总结过,无非是以下几种

(1)、基本数据结构的考察:这类题我觉得是比较简单的,主要考场基本数据结构的操作,例如二叉树的层序遍历,链表的逆序等,当然,它不会直接告诉你,让你来逆序或者遍历。

(2)、某种算法思想的掌握:这类题你掌握了某种算法思想,就会比较容易,如果不懂,那就凉凉了。例如动态规划、回溯、枚举、深度/广度、贪心、二分等。其中,我觉得动态规划考的挺多,还要就是 回溯+深度/广度。

(3)、边界条件的考察:这类型的题,估计你一看就有思路,知道该怎么做,但是,它的边界条件特别多,需要分很多种情况来讨论,特别容易出错,有时候会让人陷进去,越做越复杂,这类题主要考场你的思维严谨程度。

(4)、找规律、数学公式:这类型的题,主要是根据数据之间的一些关系,来找一些规律,进而推出他们的通用公式,就像我们高中时,找数列的同项一样。

2、按分类刷题

上面我列了笔试的题型,并且跟你说了笔试是真的挺难的,那么对于我个算法小白来说,该如何做好呢?

我的建议是,分类刷题,阶段性总结。例如最开始可以在 LintCode 按照链表/二叉树/递归等这些标签来刷,因为这样可以让你深入掌握每一种方法。

当然,笔试的题之所以难,是因为我们往往不知道用哪一种方法做好,或者说具体属于哪一种题型,那么还有必要分类刷题吗?

答是有必要的,只有当你熟悉每一种题型,你才能灵活使用他们,进而解决各类复杂的题,这就如同你在练功夫的时候,前期你需要把每个招式都打扎实了,之后才能灵活把各个招式连接起来,融合贯通。刷题也是一样,前期先分类,把每个题型掌握起来,后期咱们再随机练习,慢慢着就能灵活应用了。

不过,每次刷了一部分题型之后,我觉得还有必要做一些总结,或者说总结一些刷题模版,例如对于二分法查找,其实好几种题型总结起来,就是开闭区间的组合,你可以把他们总结起来,例如什么时候用开区间,什么时候用闭区间。

有人可能会说,模版是死的,真的有必要总结吗?

我觉得有必要总结,但没必要死记,总结,只是加深你的理解,当然,如果你在做题的时候,刚好记住了自己的模版,可以直接套上去,那肯定更好。但是,就算忘了也没事,通过自己的总结,你其实是知道怎么做的了,只是还需要你多花一点时间,快速模拟讨论下各种情况,一样能够做出来的。

也就是说,最开始刷题的时候,可以分类刷题,并且阶段性总结,如果你是初学者,可以先从简单的题做起,例如我刚才说的,简单的递归题,之后一些二叉树、链表的题,因为你可能刚刚学习数据结构不久,刚好可以加深你的理解。

三、刷题时的一些注意点

当我们在做一道题的时候,可能会遇到两种情况,一种是这道题,特么秒杀,一眼就懂思路;一种是,一脸蒙蔽,太难了吧。

一眼就懂思路,有必要做吗?

我的答案是,有必要做。千万不要眼高手低,看着简单,做起来不一定简单,AC 之后,你还要去讨论区看看大佬们是怎么做的,因为有些人的代码,真的写的很简洁,看着就很舒服,咱们可以多学一学的,当然,也有可能那个人就是你自己。

代码写多了,有时候,你就会发现自己真的变强了,写起代码来,bug 也越来越少了,分分钟 AC 一道题。

尽量最优解

其实对于很多题,如果不看时间复杂度和空间复杂度,单单只是 AC,那还是很容易的,但是一提交,你的代码可能只打败了百分之几的人,显然我们是不能满足于这种代码的。

当你做一道题时,一开始可以先暴力做,但后面,还得想想该如何优化,想不出也没事,可以讨论区找空间/时间复杂度更低的代码,或者直接搜索引擎搜索,一般都能搜到别人的代码。

之后跟着别人的代码,自己再实现一波,尽可能把最优解的代码实现起来。千万不要为了 AC 而 AC,不是 AC 的越多就越强的,当你入门之后,更多的是要总结方法,寻找高效率的代码。

四、总结

说到算法的学习方式,对我来说,真的没有什么捷径之类的,就是像我上面说的,先找本书死磕入门数据结构,就跟着书的例子,把例子跑起来就好了,跑起来也不是一件简单的事情。之后就去接触下一些算法思想,后面就可以分类刷题了,刷题就是最好的捷径了。

当然,不要 AC 之后就完事了,应该尽可能寻找最优解,当你积累了一定的题量,那么你真的会发现自己变强了,突然感觉递归也就那么一回事。

我学习算法时,基本看书 + 网上刷题,也很少看视频,因为我觉得看视频比较花时间,不过我之前在班里还是看到部分人喜欢看视频的,至于看书好还是看视频好,这个看个人喜好吧,也没有说哪种就一定更好。

说句题外话

今年很多人都在讨论一个问题:就业形势险峻,毕业生们怎么办?
错过了春招,秋招竞争激励,现在投了几十份简历却还都石沉大海,22/23届同学烦得头都快秃了。
在这里插入图片描述
其实你没事多去招聘网站上看看,你会发现不少基础岗位的招聘都写上了对python的技能要求,这也就意味着,会写程序的人会更吃香。
现在的社会,时代已经不同了,它在加速淘汰不会学习的人,所以大学期间多学点东西,不要毫无准备的去接受社会的毒打!
在这里插入图片描述
在这里插入图片描述
就算是在非专业技术领域python几乎都可以用到,特别是自动化办公和数据处理方面,python有独特的优势。而python入门相对简单,对大学生来说是一门好上手学的编程语言,就算不是找工作,利用python兼职赚点零花钱也不错啊!

如今是一个大数据的时代,Python 在行为收集和数据分析,信息采集等方面的应用已经非常非常普遍,早就不是程序员的专属技能了。就像 office 一样,是Python 已经成为了进入职场的必备技能。不是很意外,但这就是正在发生的大趋势。
在这里插入图片描述
Python的特点

1.需求大:百度、新浪、搜狐、淘宝、腾讯QQ等大部门的互联网相关企业都在利用Python,对Python的人才需求很大
在这里插入图片描述
2.开展空间广:在无孔不入的互联网使用情况下,人工智能、大数据等领域非常适合Python的发展,这也就阐明了挑选进修Python将会有很不错的发展空间。

3.简单易学:小学生也可以上手学习的计算机语言。举个例子一个程序用C语言需要1000行的代码,用JAVA需要写100行,但是如果用Python你只需要20行,语法很简洁。

Python岗位薪资水平如何?
在这里插入图片描述
在这里插入图片描述

Python如何学习?

今天只要你给我的文章点赞,我私藏的Python学习资料一样免费共享给你们,来看看有哪些东西。

Python学习大礼包

在这里插入图片描述

Python入门到精通背记手册

在这里插入图片描述
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
[CSDN大礼包:《python安装工具&全套学习资料》免费分享]安全链接,放心点击

Python安装包

在这里插入图片描述

Python爬虫秘籍

在这里插入图片描述

Python数据分析全套资源

在这里插入图片描述
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

CSDN大礼包:《python入门&进阶学习资源包》免费分享

Python实现办公自动化全套教程

在这里插入图片描述

Python面试集锦和简历模板

在这里插入图片描述
在这里插入图片描述

Python副业兼职路线

在这里插入图片描述

资料领取

[CSDN大礼包:《python安装工具&全套学习资料》免费分享]安全链接,放心点击

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xxue345678/article/details/131645896

智能推荐

对每个边缘求最小外接矩形,通过最小矩形提取每个边缘_边缘的最小外接矩形-程序员宅基地

文章浏览阅读4.9k次。#include #include using namespace std;using namespace cv;int main(){Mat src; //源图像Mat tmp; //临时图像Mat dst_bw; //去掉背景后的目标二值图像Mat dst_contours;//轮廓图像src=imread("E:\\单板图片\\求孔洞数_边缘的最小外接矩形

【设计模式】中介者-程序员宅基地

文章浏览阅读865次。中介者,说白了跟市面上黑中介类似。当然这个中介,开发者是可以控制其行为的。也是在一定的信任关系上建立的。该模式要解决的问题是,一堆对象之间交叉耦合问题。网上看过群聊的例子。如果没有任何一个平台,多人之间的会话会是什么样的呢?不举多人,就三个吧A想把一句话说给BC,那么他首先要知道B和C在哪儿,然后分别告诉对方,自己想说的事情。如果再加一个人呢?问题很明显,此时各种群聊工具应运而生。我写

Mysql列自增是怎么实现的_mysql 自增序列生成原理-程序员宅基地

文章浏览阅读1.8k次。AUTO_INCREMENT两种情况1、在载入语句执行前,已经不确定要插入多少条记录。在执行插入语句时在表级别加一个auto-inc锁,然后为每条待插入记录的auto-increment修饰的列分配递增的值,语句执行结束后,再把auto-inc锁释放掉。一个事务再持有auto-inc锁的过程中,其他事务的插入语句都要被阻塞,可以保证一个语句中分配的递增值是连续的。AUTO-INC锁的..._mysql 自增序列生成原理

半导体器件基础_掺杂半导体的带隙-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏17次。半导体能带结构示意图:上方两条白色带为没有电子填充的带,下面三条灰色带为充满电子的带,其中最高一条灰色带为价带,它与最低一条白色带之间的空隙为能隙空穴又称电洞(Electron hole),在固体物理学中指共价键上流失一个电子,最后在共价键上留下空位的现象导带(英语:conduction band),又名传导带,是指半导体或是绝缘体材料中,一种电子所具有能量的范围。这个能量的范围高..._掺杂半导体的带隙

基于C++和OpenCV的中心线提取算法_图像中心线提取c++-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏26次。基于C++和OpenCV的中心线提取算法加权平方灰度重心法介绍算法演示加权平方灰度重心法介绍详情见 https://blog.csdn.net/u010518385/article/details/101015604算法演示下面展示 函数-输入图像和阈值,输出点。void get_median_line(Mat& src, int thresh, vector<Point2d>& points){ if (src.empty()) return; // 一、_图像中心线提取c++

HTML/CSS 常用单词整理_css上下外边距单词-程序员宅基地

文章浏览阅读8.3k次,点赞27次,收藏93次。页面布局(layout)header 头部/页眉;index 首页/索引;logo 标志;nav/sub_nav 导航/子导航;banner 横幅广告;main/content 主体/内容;container/con 容器;wrapper/wrap 包裹(类似于container);menu 菜单;sub_menu/second_menu 子菜单/二级菜单;..._css上下外边距单词

随便推点

Servlet.service() for servlet [dispatcherServlet] in context with path []-程序员宅基地

文章浏览阅读1.2k次。请看:(436条消息) JdbcTemplate空指针异常_刘贵庆的博客-程序员宅基地https://blog.csdn.net/xysxlgq/article/details/124323258_servlet.service() for servlet [dispatcherservlet] in context with path [/min

超全的莫队算法一遍过-程序员宅基地

文章浏览阅读3.6k次,点赞17次,收藏63次。莫队的基本思想、回滚莫队、树上莫队、二次离线,一文搞定。什么?你还不会莫队?看完这篇文章你就会了_莫队

vmware 安装 win10_vmware 退出iso-程序员宅基地

文章浏览阅读3.3k次。1. 下载安装vm软件,地址:VM下载2. 下载win10 iso镜像文件 (1) 下载win10安装工具:win10安装工具下载 (2) 下载完成后,选择给其他电脑安装ios文件即可得到win10的iso镜像文件(考验网速的时刻到了)。 ps:试过各种百度出来的镜像文件,发现没有能用的,还是乖乖通过官方方式下载吧。3. 安装win10 ios镜像文件 参..._vmware 退出iso

PTA-求函数的值_7-2 求函数的值编写程序,求s(x)前10项的和,x从键盘输入。-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。求函数的值:已知 s(x) = x -x^3/(3x1!)+x^5/(5x2!)-x^7/(7x3!)+... 。编写程序,求s(x)前10项的和,x从键盘输入。_7-2 求函数的值编写程序,求s(x)前10项的和,x从键盘输入。

(6.1)各种USB接口简介_常用usb接口-程序员宅基地

文章浏览阅读3.6w次,点赞7次,收藏76次。/* AUTHOR: Pinus* Creat on : 2018-11-3* REFS : Type-C与Type-A、Type-B接口 Linux USB驱动学习总结(一)---- USB基本概念及驱动架构*/USB概念介绍USB,Universal Serial Bus(通用串行总线),是一个外部总线标准,用于规范电脑与外部设备的连接和通..._常用usb接口

通过Kivy将Python文件打包成apk_python程序通过kivy打包为apk且可以调用摄像头-程序员宅基地

文章浏览阅读9.3w次,点赞39次,收藏457次。一.前言Kivy 是一个开源的 Python 框架,用于快速开发应用,实现各种当前流行的用户界面,比如多点触摸等等。且Kivy 可以运行于 Windows, Linux,MacOS, Android, iOS 等当前绝大部分主流桌面/移动端操作系统。周日在配置Kivy时,教程繁多繁琐,让自己有些找不着北,挨个试后,经常在某处卡壳,屡屡碰壁,希望自己接下来的_python程序通过kivy打包为apk且可以调用摄像头