阅读 182
LeetCode《初级算法》-- JavaScript

LeetCode《初级算法》-- JavaScript

这篇文章会不断更新,来记录我刷算法时的总结和每道题的解析文章链接;

题目对应文章链接

数组

字符串

链表

动态规划

总结与思考

  1. 在求解算法时,使用 JS 原生的方法很快,因为 JS 原生的方法一般时间复杂度和空间复杂度都比较低;(eg: Array.prototype.sort() 使用的是折半插入排序,数据量小时具有很好的性能);

    但是对于算法学习和练习肯定不能直接用 api,因为这样对我们毫无帮助;

  2. 算法其实就是求解问题的方法,一步一步,总会达到目的;

    对于一般问题,我们有一般思想(分治、动态规划、贪心、回溯)指明大概的思维方向;

    但是实际在处理问题时,问题并不是明确的属于某一类,这时我们要根据题目的限制条件和规律,找出合适的算法,并且在合适的算法的基础上,对算法的每一步使用更好的方法对其进行优化,减少时间复杂度或空间复杂度;(eg: 如果一个算法的某个步骤可以使用位运算求解,那时间复杂度将会有效减少)

  3. 时间复杂度和空间复杂度往往成负相关,低的时间复杂度程序可通过提高程序的空间复杂度来获得;

  4. 对于不同规模的数据集,算法的优劣实际上是不同的,有些算法对于大规模数据集的性能比较好,但对于小规模的数据集,经常没有普通算法得到的效果好,于是在处理数据时,面对不同的数据集会做一个算法切换;(eg:求解 有限点集最近点对CP 算法 中,当点的数目小于等于 3 时,直接求解点之间的距离得到)

  5. 往往在第一遍将我们脑袋中的算法写出来时很快,如果算法可以通过测试,那很快这道题就过了;

    但经常有这样的时候,就是我们第一遍写的程序只能通过部分测试,并不能通过所有测试,在这样的情况下,往往并不是说我们的算法错误,而经常是在某个小细节或边界条件上没有处理好;

    接下来就是 Debug 的时候了,Debug 或者 回顾程序的最好方法不是在脑海中演练算法(对于大神除外),而是断点调试、打印日志和在草稿纸上画图这些方法能更好更快速的找出问题所在;

  6. 解决链表问题时

    • 双指针是好方法;
    • 给没有头节点的链表加上头节点可以统一节点的插入删除操作;
    • 因为链表结构是由一个一个节点连接而成,所以其结构就是便于递归算法的;
文章分类
前端
文章标签