当前位置: 首页 > news >正文

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

❃博主首页 : <码到三十五>
☠博主专栏 : <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. 絮叨一下

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


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

相关文章:

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

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; <搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到…...

《卷积神经网络 CNN 原理探秘》

CNN基本原理详解 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;简称CNN&#xff09;&#xff0c;是一种前馈神经网络&#xff0c;人工神经元可以响应周围单元&#xff0c;可以进行大型图像处理。卷积神经网络包括卷积层和池化层。 卷积神经网络是受…...

C#获取计算机信息

目录 效果 项目 代码 下载 效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Management; n…...

派遣函数 - 通过设备链接打开设备

利用文件IO相关的Wn32API对设备进行“打开”和“关闭”操作。要打开设备&#xff0c;必须通过设备的名字才能得到该设备的柄。前面介绍过&#xff0c;每个设备都有设备名称&#xff0c;如HelloDDK驱动程序的设备名为“Device\\MyDDKDevice”&#xff0c;但是设备名无法被用户模…...

Vue 2 中的 `$set` 方法详解

在 Vue 2 中&#xff0c;响应式数据的更新非常重要&#xff0c;因为它确保了当数据改变时&#xff0c;视图能够自动更新。Vue 使用一套高效的机制来追踪依赖并在数据变化时更新视图。然而&#xff0c;在某些情况下&#xff0c;直接修改对象的属性可能不会触发视图更新。这时&am…...

掌握Hive函数[2]:从基础到高级应用

目录 高级聚合函数 多进一出 1. 普通聚合 count/sum... 2. collect_list 收集并形成list集合&#xff0c;结果不去重 3. collect_set 收集并形成set集合&#xff0c;结果去重 案例演示 1. 每个月的入职人数以及姓名 炸裂函数 概述 案例演示 1. 数据准备 1&#xff09;表…...

水壶问题记录

https://leetcode.cn/problems/water-and-jug-problem/description/?envTypestudy-plan-v2&envId2024-spring-sprint-100...

spring综合性利用工具-SpringBootVul-GUI(五)

项目地址 https://github.com/wh1t3zer/SpringBootVul-GUI 0x01简介 本着简单到极致的原则&#xff0c;开发了这么一款半自动化工具&#xff08;PS&#xff1a;这个工具所包含了20个漏洞&#xff0c;开发不易&#xff0c;有任何问题可提issue&#xff09; 尽管是一个为懒人量…...

2024年9月12日(k8s环境及测试 常用命令)

一、环境准备及测试 1、报错处理&#xff1a; kube-system calico-node-5wvln 0/1 Init:0/3 0 16h kube-system calico-node-d7xfb 0/1 Init:0/3 0 16h ku…...

卫生间漏水原因很多,切莫病急乱投医

有位业主说他家卫生间背面的墙湿了&#xff0c;邻居家正好在装修&#xff0c;把家具拆掉以后发现墙面上有一片已经湿了。      和业主相约去现场看看&#xff0c;去楼下业主家看了看&#xff0c;顶面是干燥的&#xff0c;这就说明不往楼下漏水。      这就奇怪了&#…...

IEEE 802.11a OFDM系统的仿真(续)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第九章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; clear all %%%%%%%参数设计部分%%%%%%%Nsp52;%系统子载波数&#xff08;不包括直流载波&#xff09; Nfft64;%FFT长度 Ncp16;…...

Linux cut命令详解使用:掌握高效文本切割

cut 是 Linux 中一个用于从文本文件或标准输入中提取指定字段的命令。它根据分隔符或者字符位置来裁剪文本&#xff0c;是处理文本文件中的字段、列和子字符串的常用工具。 基本语法 cut [选项] 文件或 命令 | cut [选项]常用选项 -b&#xff1a;按字节位置切割&#xff08…...

c++11新特性——endable_shared_from_this

文章目录 一.解决场景代码示例原因 二.解决办法代码 三.底层原理 一.解决场景 一个share_ptr管理的类&#xff0c;如果从类的函数里返回类对象&#xff08;this指针&#xff09;&#xff0c;导致share_ptr引用计数错误&#xff0c;析构时异常问题 代码示例 #include <mem…...

小程序的右侧抽屉开关动画手写效果

<template><view><button click"openDrawer">打开抽屉</button><view v-if"showDrawer" class"drawer" :style"{ backgroundColor: bgColor }" click"closeDrawer"><view class"draw…...

vue3中el-table中点击图片放大时,被表格覆盖

问题&#xff1a;vue3中el-table中点击图片放大时&#xff0c;被表格覆盖。 解决方法&#xff1a;el-image 添加preview-teleported <el-table-column label"封面图" prop"coverUrl"><template #default"scope"><el-imagestyle&q…...

GO学习笔记(4) strconv/time

目录 strconv包1、string与bool之间的转换2、string与int之间的转换 time包1、常用常量定义2、Now&#xff08;&#xff09;获取当前年月日时分秒3、Format&#xff08;&#xff09;时间格式化4、Parse&#xff08;&#xff09;/ ParseInLocation&#xff08;&#xff09;解析时…...

课程管理系统-数据库-基于MySQL的数据库课程设计

目录 前言一、需求分析二、设计数据库模型1.实体关系图(ERD)2.表结构设计三、创建数据库和表四、插入数据五、查询数据六、更新和维护七、安全性与性能优化总结前言 设计一个数据库课程(或任何课程管理系统)时,我们首先需要明确系统的需求和目标。以下是一个基于MySQL的数…...

降维打击 华为赢麻了

文&#xff5c;琥珀食酒社 作者 | 积溪 真是赢麻了 华为估计都懵了 这辈子还能打这么富裕的仗&#xff1f; 其实在苹果和华为的发布会召开之前 我就知道华为肯定会赢 但我没想到 苹果会这么拉胯 华为这是妥妥的降维打击啊 就说这苹果iPhone 16吧 屏幕是变大了、颜色…...

[数据集][目标检测]汽车头部尾部检测数据集VOC+YOLO格式5319张3类别

数据集制作单位&#xff1a;未来自主研究中心(FIRC) 版权单位&#xff1a;未来自主研究中心(FIRC) 版权声明&#xff1a;数据集仅仅供个人使用&#xff0c;不得在未授权情况下挂淘宝、咸鱼等交易网站公开售卖,由此引发的法律责任需自行承担 数据集格式&#xff1a;Pascal VOC格…...

python 生成的代码,需要帮我生成一个直接在一台没有依赖的电脑上运行的 包

要创建一个可以在没有依赖的电脑上运行的包&#xff0c;你需要将你的代码和所有依赖项打包成一个可执行文件。对于Python项目&#xff0c;这通常意味着使用一些工具来打包你的代码和所有必要的库。以下是一些常用的工具和步骤&#xff1a; 确定依赖&#xff1a;首先&#xff0c…...

【Linux】操作系统与进程

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:Linux ⚙️操作环境:Xshell (操作系统:CentOS 7.9 64位) 目录 &#x1f4cc;操作系统 &#x1f38f;操作系统的概念 &#x1f38f;设计操作系统的目的 &#x1f38f;操作系统对进程的管理 &#x1f579;️操作系统为什么…...

【Linux】 LTG:移动硬盘部署Ubuntu24.04

Ubuntu To Go 是一种便携式的 Ubuntu 操作系统解决方案&#xff0c;允许用户将 Ubuntu 系统安装在 USB 驱动器或其他可移动存储设备上。这样&#xff0c;用户可以在任何支持 USB 启动的计算机上运行 Ubuntu&#xff0c;而无需在本地硬盘上进行安装。 准备工作 移动硬盘&#x…...

Android的logcat日志详解

Android log系统 logcat介绍 logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息。下面介绍 adb logcat中的详细参数命令以及如何才能高效的打印日志&#xff0c;或把日志保存到我们指定的位置。 可以输入 adb logcat --help&#xff0c;查看一下一些简…...

【Linux】:信号的保存和信号处理

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家带来信号的保存和信号处理相关代码和知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入…...

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…...

跨境电商必备保护账号的4个网络环境设置

在跨境电商的世界里&#xff0c;一个稳定可靠的网络环境就是你事业成功的关键&#xff01;但是&#xff0c;不稳定的IP很容易导致账号被封&#xff0c;让你的辛苦付之东流&#xff0c;相信许多小伙伴也经历过莫名其妙的账号封禁情况&#xff01; 为了让大家避免这种心痛的情况…...

Python+requests接口自动化测试框架实例教程

前段时间由于公司测试方向的转型&#xff0c;由原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的…...

【网络安全】DNS重绑定原理详析

原创文章,不得转载。 文章目录 DNSDNS查询过程同源策略DNS重绑定攻击原理DNS重绑定攻击步骤DNS重绑定工具工具一工具二DNS 在网络中,访问网站实际上是通过其对应的 IP 地址实现的,然而,IP 地址往往难以记忆。因此,DNS(域名系统)应运而生。 DNS(Domain Name System)是…...

C语言初识编译和链接

目录 翻译环境和运行环境编译环境预编译编译词法分析语法分析语义分析 汇编 链接运行环境 翻译环境和运行环境 在ANSI C的任何⼀种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执⾏的机器指令&#xff08;⼆进制指令&…...

TrinityCore环境搭建

1)https://192.168.3.96:41797/soft/app root jianan2)mysql322bb8f85b0920d9 192.168.3.96 9f5c813fefbbc3aa3) su wow cd /home/wow/TrinityCore/TrinityCore-TDB335.22061/build cmake ../ -DCMAKE_INSTALL_PREFIX/home/wow/server3.5.5 #构建项目cmake ../ -DCMAKE_INSTALL…...