新手如何有效的刷算法题(LeetCode)

2023-11-01

点击关注上方“五分钟学算法”,

设为“置顶或星标”,第一时间送达干货。

来源:五分钟学算法


前言

作为一名非科班出身的程序员,我是参加工作之后才开始接触算法,学算法至今有将近五年的时间,期间输出文字约 100 多万,从算法小白到写出百万阅读的算法文章,这一路历程,有心酸也有掌声。

过往历历在目,没有谁比我更了解算法小白的焦虑与迷茫。

每每在公众号后台看到读者留言求教时,我都在想:我能为他们做点什么。

我决定把我曾经踩过的坑以及总结出来的经验毫无保留的分享给你,希望能为你拨开迷雾。

这些经验并不会适合每个人,但或许也能对你有所启发。

今天这篇文章聊的话题就是新手如何有效的刷算法题(LeetCode)。


如果你想要开始刷题,那么第一步就是:打开 LeetCode 官网,点击标签,选择一道顺眼的题目开始刷

注意,在这过程中,不要左思右盼,不要去搜索与思考到底是刷 LeetCode 好还是去牛客网刷剑指 Offer 好。

我作为一名算法小白的时候,就犯了这个错误:在粗略的了解基本的数据结构与算法后,准备开始刷题,总想着找一个最有效最好的刷题平台。

一会在 LeetCode 题解区逛逛,一会在牛客网看看面经,结果就是整个人烦躁不安,焦虑迷茫,题没有刷几道,羡慕嫉妒恨却增加了几分:别人的代码怎么这么简洁 ?别人的 Offer 怎么这么亮眼?

经过痛定思定之后,我开始自我剖析自己想好好刷题却无效的原因:

1、没有接受自己是算法小白的事实

我那时候只是按图索骥般的稍微系统的接触了基础数据结构与算法知识,根本没有真正的利用这些知识去处理问题。

在刷题的过程中,总想证明自己可以的,别人可以写成简洁高效的解题方法,我也要!于是去不停的找题证明自己,结果就是越刷越没有效果,自己根本就看不懂题目考察的数据结构与思想。

整个人完全奔溃,不刷题了,不准备算法面试了,不准备跳槽了!

后来我不停的告诫自己:作为一名非科班的程序员,肯定比不上他们呀,如果随随便便的学了一点就能刷题顺利,那别人大学四年不白学了!

所以前期先接受自己的思考方式,暴力解法其实也是一种有效的解法

2、没有合理的刷题

我只是盲目的追求刷题的数量,即使刷了 200 道,脑中依旧一团浆糊。

后来才明白,吃透一道题目比乱刷十道题目更有价值

经过不断的摸索与试验,形成了自己的一套刷题路径。

  1. 自己的解法

  2. 网上好的解法

  3. 自己的解法可以优化的地方

  4. 不停的优化

  5. 寻找相同的题型

  6. 总结

每一个题目都经过至少一遍这样的迭代,彻底吃透一道题进而掌握一种题型。

以一道极其简单的动态规划题为例 ,LeetCode 第 70 号问题:爬楼梯。

当时的我根本不知道动态规划的相关概念,什么状态,什么转移方程,通通没听过。

没错,当时就那么菜!

二话不说,直接使用暴力解法。

class Solution {
    public int climbStairs(int n) {
        return calcWays(n);
    }
    private int calcWays( int n ){
        if ( n == 1) return 1;
        if ( n == 2) return 2;
        return calcWays(n-1) + calcWays(n-2);
    }
}

很明显,无脑的递归暴力解法包含了大量的重复计算,提交上去直接标红提示超出时间限制

后来看了网上高票答案的分析,知道了备忘录的概念,于是很容易写出优化后的代码。

//采用备忘录的方式来存子问题的解以避免大量的重复计算


class Solution { 
    int[] memo; 
    public int climbStairs(int n) { 
        memo = new int[n+1]; 
        return calcWays(n); 
    } 
    private int calcWays( int n ){ 
        if ( n == 1) return 1; 
        if ( n == 2) return 2; 
        if (memo[n] == 0) 
           memo[n] =  calcWays(n-1) + calcWays(n-2); 
        return memo[n]; 
    }


}

再后来,发现备忘录是自顶 向下的方式,稍许变动,修改为自低 向上的递推方式就是动态规划的形式。

class Solution {


    public int climbStairs(int n) { 
        int[] memo = new int[n+1]; 
        memo[0] = 1; 
        memo[1] = 1;


        for(int i = 2 ; i <= n; i++){ 
            memo[i] = memo[i-1] + memo[i-2]; 
        } 
        return memo[n]; 
    } 
}

按照这样的刷题路径下来,发现对这类题型有了初步的思考途径,有了发力点,再也不会一筹莫展:看题懵逼半小时,Coding 只会按空格

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

通过这些练习,寻找题目中的共同点,为什么这类题型都可以这样思考呢?

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

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

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

后记

如果说成为大神有什么诀窍的话,那就是相信时间的力量,每天进步一点就够了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新手如何有效的刷算法题(LeetCode) 的相关文章

随机推荐

  • _mm_pause

    翻译自Intel指令 PAUSE指令提升了自旋等待循环 spin wait loop 的性能 当执行一个循环等待时 Intel P4或Intel Xeon处理器会因为检测到一个可能的内存顺序违规 memory order violation
  • 1.2冯•诺依曼模型

    文章目录 1 2 1 4个子系统 1 2 2 存储程序概念 1 2 3 指令的顺序执行 前一节中讲到的基于图灵机所建造的计算机是在存储器中存储数据 在1944 1945年期间 冯 诺依曼指出 程序和数据在逻辑上是相同的 因此程序也能存储在计
  • Mariadb主从复制之MHA配置

    Mariadb主从复制之MHA配置 一 环境介绍 1 主从复制及半同步复制配置链接 2 IP规划 二 检查一主两从数据库状态 1 主库状态 2 从库状态 三 MHA高可用介绍 1 MAH介绍 2 MAH作用 四 MHA基本环境配置 1 所有
  • linux线程使用

    概念 1 PCB Process Control Block 进程管理块 系统中存放进程的管理和控制信息的数据结构体 每一个进程均有一个PCB 在创建进程时建立 直到进程撤销而撤销 2 程序段 是进程中能被进程调度程序在CPU上执行的程序代
  • STL空间配置

    SGI STL有两级配置器 第一级配置器的allocate 和 realloc 都是在调用malloc 和 realloc 不成功后 改调用oom malloc 和 oom realloc 后两者都有内循环 不断调用 内存不足处理例程 期望
  • Unity3D中读取CSV文件

    转自 https www cnblogs com lingLuoChengMi p 9990488 html 本人对原文进行了整理 适当加上注释和小部分修改 不过大部分代码也是转载 说明 1 写入一个单元格时 如果含有逗号 则需要将整个字段
  • NVIDIA可编程推理加速器TensorRT学习笔记(三)——加速推理

    文章目录 简单张量RT示例 将预训练的图像分割 PyTorch 模型转换为 ONNX 将 ONNX 模型导入 TensorRT 生成引擎并执行推理 对输入进行批处理 分析应用程序 优化您的应用程序 使用混合精度计算 更改工作区大小 重用 T
  • 主成分分析二级指标权重_权重赋值之“主成分分析法”

    主成分分析 Principal Component Analysis PCA 最早是由K 皮尔森 Karl Pearson 对非随机变量引入的一种统计方法 尔后H 霍特林将此方法推广到随机向量的情形 主成分是指通过正交变换将一组可能存在相关
  • 阿里云物联网Iot设备上下线状态数据流转的设置

    要想通过物联网平台实现远程监控设备 那么就要建立监控端设备 比如手机 和被监控端设备的数据交互 在阿里云物联网平台完成这个交互功能的方法就是建立两个设备之间的数据流转 对于设备要流转的物模型数据 阿里云网站上已经有详细的示例介绍 但是对于设
  • 最大上升序列Super Jumping! Jumping! Jumping!

    多组输入 第一个数代表有多少个数据 输入0结束 Sample Input 3 1 3 2 4 1 2 3 4 4 3 3 2 1 0 Sample Output 4 10 3 1到3最大 1到2到3到4最大 直接到三最大 include
  • 尚硅谷 Vue 2.0 + Vue 3.0 入门到精通教程学习笔记 (二)

    第二章 Vue 组件化编程 2 1 模块与组件 模块化与组件化 2 1 1 模块 1 理解 向外提供特定功能的 js 程序 一般就是一个 js 文件 2 为什么 js 文件很多很复杂 3 作用 复用 js 简化 js 的编写 提高 js 运
  • Qt 无边框、透明、可移动、的个性窗体

    原文地址 转载 Qt 无边框 透明 可移动 的个性窗体案例详解 作者 风贝 很多朋友都问透明的效果怎么做 为什么自己做的无边框窗体不可移动 一个个回答的很累 干脆写出来分享下好了 我只用代码说话 工程的main cpp int main i
  • python菜单栏_「每日一练」Python实现下拉和弹出式菜单

    用Python就一定要用到界面操作 有一个好的用户界面 才会有好的用户体验 下边就开始创建我们的主窗口 并实现下拉和弹出式菜单 案例 创建主窗口 并实现下拉和弹出式菜单 先上代码 运行效果 题目详述 第一行 import tkinter a
  • Jupyter notebook显示连接失败、服务器正忙

    pip install tornado 4 5 成功
  • # AutoLeaders控制组—51单片机学习笔记(LED控制、独立按键、数码管)

    51单片机 1 单片机基础 1 1 内部构成 CPU RAM ROM 定时器 中断系统 通讯接口等 相当于袖珍版计算机 一个芯片能构成完整的计算机系统 1 2 51单片机 公司 STC公司 位数 8位 RAM 512字节 第二天丢失 相当于
  • HashMap底层源码分析

    HashMap HashMap 是一个散列表 它存储的内容是键值对 key value 映射 HashMap是非线程安全的 实现了 Map 接口 根据键的 HashCode 值存储数据 具有很快的访问速度 最多允许一条记录的键为 null
  • 编译原理期末习题考试复习题目(重点三)

    编译原理期末习题考试复习题目 重点三 目录 编译原理期末习题考试复习题目 重点三 三 判断题 四 简答题 三 判断题 下列各题 你认为正确的 请在题干的括号内打 错的打 1 计算机高级语言翻译成低级语言只有解释一种方式 X 2 在编译中进行
  • CMOS图像传感器——pipeline像素控制

    一 传统像素操作 传统CMOS图像传感器的芯片架构中 像素的控制信号从水平方向驱动 像素的源极跟随器输出电压垂直地输出到位于顶部和底部的模拟前端读出电路 其具体实现方式如下图所示 其中RST TX和SEL是像素水平控制信号 像素输出电压PI
  • CMake中aux_source_directory的使用

    CMake中的aux source directory命令用于查找目录中的所有源文件 其格式如下 aux source directory
  • 新手如何有效的刷算法题(LeetCode)

    点击关注上方 五分钟学算法 设为 置顶或星标 第一时间送达干货 来源 五分钟学算法 前言 作为一名非科班出身的程序员 我是参加工作之后才开始接触算法 学算法至今有将近五年的时间 期间输出文字约 100 多万 从算法小白到写出百万阅读的算法文