算法学习攻略总结 : 入门至进阶,通关之路指南

news2024/11/13 3:31:56
❃博主首页 : <码到三十五>
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : <搬的每块砖,皆为峰峦之基;公众号搜索(码到三十五)关注这个爱发技术干货的coder,一起筑基>

你是否也曾因为一道算法题挣扎半天,再看题解半天,感觉自己智商不在线?

学算法、刷 LeetCode 绝非一蹴而就,它需要一个循序渐进的过程。

导读

        • 1. 初学者的常见误区
        • 2. 新手小白如何有效刷算法题
          • 2.1. 没有接受自己是算法小白的事实
          • 2.2. 没有合理的刷题方法
        • 3. 正确的算法学习路径
          • 3.1. 基础数据结构与算法知识
          • 3.2. 常见算法思想
          • 3.3. 如何刷题
            • 3.3.1. 了解互联网算法笔
            • 3.3.2. 笔试的题型类型总结
            • 3.3.3. 分类刷题
            • 3.3.4. 阶段性总结
        • 4. 刷题时的注意点
        • 5. 学习资料汇总及推荐
        • 6. 絮叨一下

1. 初学者的常见误区

初学者在学算法时往往容易陷入一些误区。比如,一开始就抱着《算法导论》这样的天书啃,或者在还没学好基本数据结构的情况下就去刷 LeetCode。这其实是不明智的,只会让自己对算法望而却步,甚至放弃。

2. 新手小白如何有效刷算法题

想要开始刷题吗?很简单:打开 LeetCode 官网,选一道顺眼的题目,然后开始刷。但是别纠结于选择哪个刷题平台。

刚刚接触算法,在学习了基本的数据结构与算法后,很多人准备开始刷题,却总想着找一个最有效、最好的刷题平台。一会儿在 LeetCode 题解区逛逛,一会儿在牛客网看看面经,结果整个人都烦躁不安,焦虑迷茫。题没刷几道,羡慕嫉妒恨却增加了几分:别人的代码怎么这么简洁?别人的 Offer 怎么这么亮眼?

在这里插入图片描述

经过深刻的反思,我们来剖析自己刷题无效的原因:

2.1. 没有接受自己是算法小白的事实

刚接触算法的时候,只是系统地学习了基础数据结构与算法知识,但并没有真正利用这些知识去解决问题。在刷题的过程中,总想证明自己可以,别人能写出简洁高效的解题方法,我也想!于是我不停地找题证明自己,结果却越刷越没有效果,自己根本就看不懂题目考察的数据结构与思想。整个人完全崩溃,甚至想过放弃算法面试和跳槽。

后来,告诉自己, 如果随随便便学一点就能顺利刷题,那大学四年不就白学了!所以,前期要先接受自己的思考方式,暴力解法其实也是一种有效的解法。

2.2. 没有合理的刷题方法

如果只是盲目地追求刷题的数量,即使刷了200道,脑中依旧一团浆糊。后来才明白,吃透一道题目比乱刷十道题目更有价值。

经过不断的摸索与试验,我们形成了一套刷题路径:

  • 自己的解法
  • 网上好的解法
  • 自己的解法可以改进的地方
  • 不停的优化
  • 寻找相同的题型重复练习
  • 总结

每一道题目都至少经过一遍这样的迭代,彻底吃透一道题,进而掌握一种题型。按照这样的刷题路径下来,我发现自己对这类题型有了初步的思考途径,有了发力点,再也不会一筹莫展:看题懵逼半小时,Coding 只会按空格。

彻底搞懂这题后,就需要找到类似的题型,然后不断地重复练习,比如:最小路径和、整数拆分、完全平方数、解码方法、不同路径、不同路径 II。

通过这些练习,寻找题目中的共同点,思考为什么这类题型都可以用相似的方法解决。

慢慢的,掌握了最优子结构、状态转移方程、重叠子问题等概念,不知不觉间,已经掌握了动态规划知识点的80%。

再遇到更高难度的动态规划题目时,心里也明白,一时半会没做成,无非就是最优子结构、状态转移方程、重叠子问题没有理清楚。

这样长期坚持下来,接触新的题型时也就可以从容不迫地思考。

3. 正确的算法学习路径

要避免这些误区,我们需要有一个正确的算法学习路径。

3.1. 基础数据结构与算法知识

在学习算法之前,你需要先掌握一些基础的数据结构与算法知识。

  • 时间复杂度和空间复杂度:这是算法学习中必须最先掌握的概念,包括最大复杂度、平均复杂度等。你可以通过博客搜索来学习这些概念及其计算方法。
  • 线性表:包括列表(必学)、链表(必学)、跳跃表(了解原理、应用并实现)、并查集(建议结合刷题学习)。其中,链表和列表是重点,特别是链表。
  • 栈与队列:包括栈(必学)、队列(必学)、优先队列、堆(必学)、多级反馈队列(了解原理与应用)。
  • :包括二叉树的各种遍历(递归与非递归,必学)、哈夫曼树与编码(了解原理与应用)、AVL树(必学)、B树与B+树(了解原理与应用)、前缀树(了解原理与应用)、红黑树(了解原理与应用)、线段树(了解原理与应用)。树相关的知识很多,建议看书学习,如《算法第四版》。

在刷题前,不需要掌握所有的数据结构,但至少要学会最基本的二叉树。

3.2. 常见算法思想

掌握了一些基础的数据结构之后,可以开始学习一些常见的算法思想。

  • 递归:这是最重要的算法思想之一,很多其他算法都会涉及到递归。因此,在学习二叉树、图相关算法等遇到递归时,希望你能静下心来学习递归。
  • 枚举:一种简单的算法思想,通过遍历所有可能的情况来找到问题的解。
  • 贪心:一种在每一步都选择当前状态下最优的选择的算法思想。
  • 回溯:一种通过试错来找到问题的解的算法思想。
  • 动态规划:一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的算法思想。

其中,递归是最重要的算法思想之一,你必须要入门。而动态规划、回溯等可以后面刷题遇到时再学。枚举和贪心相对比较简单。

3.3. 如何刷题

掌握了基础的数据结构和算法思想之后,你就可以开始刷题了。

3.3.1. 了解互联网算法笔

在刷题之前,我想先说一说笔试。如果笔试不考算法,面试也不考算法,那么我可能在学习算法的这条路上会少了很多的积极性。

但是,带着功利性的目的去学习算法也是完全没问题的。在校招的笔试中,这些笔试题通常都很难。你可能在 LeetCode 上能做出 hard 级别的题,但在笔试中可能连 medium 级别的都做不出。

因为笔试的题都比较灵活,基本都会通过实际的例子来引出一道题。你可能不知道要使用哪种方法来做比较好,有些还是多种方法的结合。

3.3.2. 笔试的题型类型总结

(1)基本数据结构的考察:这类题我觉得是比较简单的,主要考场基本数据结构的操作,例如二叉树的层序遍历,链表的逆序等,当然,它不会直接告诉你,让你来逆序或者遍历。
(2)某种算法思想的掌握:这类题你掌握了某种算法思想,就会比较容易,如果不懂,那就凉凉了。例如动态规划、回溯、枚举、深度/广度、贪心、二分等。其中,我觉得动态规划考的挺多,还有就是回溯+深度/广度。
(3)边界条件的考察:这类型的题,估计你一看就有思路,知道该怎么做,但是,它的边界条件特别多,需要分很多种情况来讨论,特别容易出错,有时候会让人陷进去,越做越复杂,这类题主要考场你的思维严谨程度。
(4)找规律、数学公式:这类型的题,主要是根据数据之间的一些关系,来找一些规律,进而推出他们的通用公式,就像我们高中时,找数列的同项一样。

3.3.3. 分类刷题

例如最开始可以在 LintCode 按照链表/二叉树/递归等这些标签来刷,因为这样可以让你深入掌握每一种方法。当然,笔试的题之所以难,是因为我们往往不知道用哪一种方法做好,或者说具体属于哪一种题型。

那么还有必要分类刷题吗?

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

3.3.4. 阶段性总结

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

有人可能会说,模版是死的,真的有必要总结吗?我觉得有必要总结,但没必要死记。总结只是加深你的理解。当然,如果你在做题的时候,刚好记住了自己的模版,可以直接套上去,那肯定更好。

但是,就算忘了也没事,通过自己的总结,你其实是知道怎么做的了,只是还需要你多花一点时间,快速模拟讨论下各种情况,一样能够做出来的。

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

4. 刷题时的注意点

在刷题的过程中,你需要注意以下几点:

  1. 不要眼高手低:即使一道题看起来简单,也要动手去做。AC之后,还要去讨论区学习更优解,因为有些人的代码写得非常简洁、优雅,你可以多学一学。

  2. 追求最优解:不要满足于仅仅AC一道题。你应该尝试优化你的代码,追求时间复杂度和空间复杂度的最优解。当你做一道题时,一开始可以先用暴力方法解决,但后面还得想想该如何优化。想不出也没事,可以去讨论区找空间/时间复杂度更低的代码,或者直接用搜索引擎搜索。之后跟着别人的代码自己再实现一遍,尽可能把最优解的代码实现出来。

5. 学习资料汇总及推荐

学习算法没有捷径可走:先死磕入门数据结构,然后接触一些算法思想,最后开始分类刷题。刷题就是最好的捷径了,但刷题后不要就此止步,应该尽可能寻找最优解。当你积累了一定的题量后,你会发现自己的算法能力得到了显著提升。

在书籍方面: 推荐《数据结构与算法分析:C语言描述版》和《算法第四版》, 这两本书都是非常好的算法入门书籍。
也可以选择《算法导论》或《数据结构与算法分析》等经典教材著作。

在视频方面: 当然,你也可以看视频学习,这看个人喜好。我习惯先看视频,2倍速度播放,再攻书籍。 重要的是坚持学习和实践,不断提升自己的算法能力。

视频方面为大家整理好了,一些对学习算法非常有帮助的资源。如果需要的话,可以在公众号 [ 码到三十五 ] 后台回复"算法",看到后我会加你免费发送给你下载地址,。希望这些资料能够帮助你在算法工程师的道路上走得远一点点!

这是数据结构和算法的学习视频
在这里插入图片描述

这是数据结构和算法的面试刷题视频
在这里插入图片描述

6. 絮叨一下

学习算法需要时间和耐心,但只要你坚持下去并不断努力提升自己的技术能力,就一定能够在算法工程师的道路上取得很多收货。记住,技术能力的高低决定你能走多远,而平台的高低则决定你能飞多高。所以请珍惜每一次学习的机会并努力提升自己的实力吧!无论你是初学者还是有一定经验的算法工程师,都希望你能在这条道路上不断进步、不断成长!


关注公众号获取更多技术干货 !

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CircleProgressView 鸿蒙ArkTS自定义View实现圆形进度条

上篇的截图中除了一个上下的箭头&#xff0c;还有一个圆形进度条&#xff0c;今天我们来讲讲这个如何进行实现 我们看这个图形的构造&#xff0c;其实很简单&#xff1a;一个圆形图形&#xff0c;以及一个文本来显示进度 所以我们用一个层叠布局 绘制一个带颜色的圆形&#xff…

『功能项目』播放动画时禁止点击移动【40】

我们打开上一篇39GameObject对象池 - 第三职业的项目&#xff0c; 本章要做的事情是在第三职业播放续航攻击动画时禁止点击时触发的移动函数&#xff0c;换句话说是在播放攻击动画时禁止移动 修改脚本&#xff1a;PlayerRayClickNavigation.cs 运行项目 - 播放第三职业续航技能…

2-92 基于matlab的KPCA的TE过程的故障监测

基于matlab的KPCA的TE过程的故障监测&#xff0c;利用核主元分析法(KPCA)来进行故障检测的思想,将输入空间中复杂的非线性问题转化为特征空间中的线性问题&#xff0c;计算步骤&#xff1a;&#xff08;1&#xff09; 选择监控变量&#xff0c;收集正常工况下的各变量的样本&am…

【警告 C6031:返回值被忽略:scanf】

警告 C6031 返回值被忽略: “scanf”。 错误 C4996 scanf: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. #include <stdio.h> int max(int x, int y…

OKHttp实现原理分享

前言介绍 大约在2年半之前&#xff0c;就想写一篇关于OKHttp原理的文章&#xff0c;一来深入了解一下其原理&#xff0c;二来希望能在了解原理之后进行更好的使用。但是因为种种原因&#xff0c;一直无限往后推迟&#xff0c;最近因为我们情景智能半个月一次的分享轮到我了&…

手势识别&手势控制系统-OpenCV&Python(源码和教程)

项目特点 手部手势识别&#xff1a; 项目利用计算机视觉技术来识别手部的各种手势。这种技术可以应用于多种场景&#xff0c;比如人机交互、游戏控制、无障碍技术等。 自定义手势&#xff1a; 用户可以自定义手势&#xff0c;这意味着可以通过训练新的手势模式来扩展系统的功能…

基于vue框架的城市网约车管理系统v34td(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,司机,订单评价,完成订单,司机接单,打车订单 开题报告内容 基于Vue框架的城市网约车管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速和互联网技术的飞速发展&#xff0c;网约车服务作为一种新兴的出行方…

基于java+SpringBoot+Vue的阿博图书馆管理系统设计与实现

开发语言:Java 数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统简介 阿博图书馆管理系统是一款基于Java、SpringBoot和Vue.js技术开发的信息化管理系统&#xff0c;旨在为图书馆提供一个高效、便捷的图书管理与借阅服务。系统通过B/S架构&#x…

FinalShell连接Linux服务器并解决反复输入密码问题

FinalShell是一款由国人开发的SSH客户端工具&#xff0c;它支持多平台&#xff0c;包括Windows、Mac OS X和Linux。FinalShell主要用于一体化服务器管理&#xff0c;它不仅是一个SSH客户端&#xff0c;还具备强大的开发和运维功能&#xff0c;能够充分满足开发和运维的需求。 本…

人脸匿名化初步研究:解决人脸隐私安全

1、人脸匿名化定义&#xff1a; 将人脸图像匿名化方法从图像语义修改、图像语义保持、视觉可恢复以及深度学习过程中的人脸隐私保护四个方面进行分类&#xff0c;将人脸视频匿名化方法从聚焦面部区域隐私的视频匿名化方法和面向生物特征隐私的视频匿名化方法两个方面进行分类 …

开源FormCreate低代码表单组件的配置项和事件的详解

在使用开源FormCreate低代码表单时&#xff0c;您可以通过各种 props 来定制表单的行为和外观。这些参数允许您控制表单的生成规则、配置选项、双向数据绑定等&#xff0c;为复杂的表单场景提供了强大的支持。 源码地址: Github | Gitee FormCreate组件Props 以下是常用的 pr…

【项目开发 | Python】基于“羊了个羊“风格的消除类小游戏

原创文章,不得转载。 目标:使用 Python 开发"羊了个羊"风格的消除类小游戏,合理运用 AIGC 工具提高开发效率;使用文生图工具实现图片设计等工作。 文章目录 项目背景项目介绍+项目展示游戏逻辑概述主界面游戏界面获胜界面失败界面附加功能项目细节项目测试测试样…

zabbix之钉钉告警

钉钉告警设置 我们可以将同一个运維组的人员加入到同一个钉钉工作群中&#xff0c;当有异常出现后&#xff0c;Zabbix 将告警信息发送到钉钉的群里面&#xff0c;此时&#xff0c;群内所有的运维人员都能在第一时间看到这则告警详细。 Zabbix 监控系统默认没有开箱即用…

JavaScript进阶day4

目录 1.深浅拷贝 1.1 浅拷贝 1.1.1 浅拷贝的认识 1.1.2 浅拷贝的小结 1.2 深拷贝 1.2.1 递归实现深拷贝 1.2.2 js类库lodash/cloneDeep实现深拷贝 1.2.3 JSON.stringify()实现深拷贝 2.异常处理 2.1 throw 抛异常 2.2 try /catch 捕获异常 2.3 debugger 3.处理thi…

嵌入式边缘计算:融合创新与未来展望

本文深入探讨了嵌入式边缘计算。首先解析了其概念&#xff0c;指出它是将计算和数据存储能力嵌入边缘设备以实现本地数据处理。阐述了其低延迟、高可靠性、节省带宽、隐私保护和高效节能等技术特点。接着介绍了关键技术&#xff0c;包括嵌入式系统设计、边缘计算架构、通信技术…

关于QT服务端客户端的聊天

服务段头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer> #include<QMessageBox> #include<QDebug> #include<QList> #include<QTcpSocket>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_N…

设计一个算法,找出由str1和str2所指向两个链表共同后缀的起始位置

假定采用带头结点的单链表保存单词&#xff0c;当两个单词有相同的后缀时&#xff0c;则可共享相同的后缀存储空间&#xff0c;例如&#xff0c;’loading’和’being’的存储映像如下图所示。 设str1和str2分别指向两个单词所在单链表的头结点&#xff0c;链表结点结构为 data…

HashTable哈希表

概念 散列表(Hash Table)&#xff0c;又称哈希表。是一种数据结构&#xff0c;特点是:数据元素的关键字与其存储地址直接相关 在顺序结构以及树型结构中&#xff0c;数据元素的关键字与其存储位置没有对应的关系&#xff0c;因此在查找一个元素时&#xff0c;必须要经过关键码…

KV260 进阶开发(PYNQ驱动开发+Pixel Pack)

目录 1. 简介 2. PixelPacker HLS 实现 2.1 PixelPacker HLS 源码 2.2 PixelPacker 功能简介 2.3 头文件介绍 2.4 启动间隔 II 2.5 Case V24 片段解释 3. PixelPacker Py 驱动 3.1 PixelPacker Py 源码 3.2 PixelPacker 类详解 3.3 property 装饰器 3.4 操作寄存器…

一、(JS)JS中鼠标事件-mouseenter、mouseleave和mouseover、mouseout区别

一、单个元素下mouseenter、mouseleave和mouseover、mouseout没有区别 我们先来一个demo&#xff0c;设置一个div <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…