作为前端,我是如何在Leetcode 算法比赛中进入前100的?

本文讲述了提升算法技能的四个步骤:识别问题类型、利用关键字辅助解题、草稿上写出算法思路并考虑边界情况。强调了JavaScript在算法竞赛中的局限性,并提供了前端开发者学习资源链接。
摘要由CSDN通过智能技术生成

|

做题第二步:识别问题类型

我们在训练的初期,需要熟练各种解题模板。在熟练了解题的模板之后,我们才能够从题目内容倒退出题目的类型。

这也是为什么很多人推荐第一次要按照 tag 来进行刷题的原因,按照 tag 刷题也就意味着你可以对这种类型题目进行多方面强化,能够帮助你思考、总结、抽象到后面的举一反三。

按照 tag 刷题后,一般你会总结出常见的数据结构、思想以及算法,比如如下:

  1. 必须掌握的数据结构:数组、链表、栈、队列、堆、树、散列表、图、并查集

  2. 必须掌握的算法:递归、DFS 和 BFS、排序、二分法、双指针、滑动窗口

  3. 常用思想:分治、贪心、回溯、动态规划和分支界限

  4. 常见技巧:位运算、双指针、滑动窗口

在总结出这些常用抽象特征之后,往往你已经在 LeetCode 中已经过关斩将至少 100 题了。这也就意味着你已经进入了可以举一反三、联想关联的时候了。

但很多人在看到新题的时候还是不知道该如何联想到具体的解法,这通常意味着两点:

  1. 你对真正的解法理解的不够透,联想关联不够强

  2. 你对题目的抽象能力不够,也就是如何去除掉题目无关信息,提取出关键东西来

那么,这时候该怎么办。一个是在平时训练,尽量自己先想解法。如果实在想不出来(比如已经卡了一个小时了),就直接看答案,然后记录这道题目,过半个月在重新做一遍。

这里看答案也是有技巧的,你是怎么看答案的?你看答案的时候一定不能直接 copy 代码,而是先尽量理解答案的算法思路,然后用笔在纸上画出逻辑流程,如果不懂,再根据答案的示例代码脑袋里走一遍。最后关闭答案,自己写题目。

另外,我们可以通过题目关键字来帮助解题,我们在联想题解模板的时候,可以通过这些关键字来猜测。

  1. 如果题目中出现 连续子串, 连续子数组 这类的字眼,然后要求时间复杂度  ,那么你可以尝试用滑动窗口的思路解决。

举几个例子,比如 leetcode 中的 3. 无重复字符的最长子串

这道题目就是求最长的连续不含重复字符的子串,经典的滑动窗口题目。

76. 最小覆盖子串

同样可以抽取出来关键字 最小连续子串,而覆盖 T 中所有字符只是其中的制约条件而已,经典的滑动窗口题目。

解题第三步:草稿上写出算法思路

做算法题最忌讳的就是一看到题目,还没有想清楚思路和边界情况,就直接动手写代码。

能够直接动手写代码大概有几种情况:

  1. 你是超级大佬,比如楼教主这种

  2. 接近原题,或者这类题目你已经熟透了

  3. 题目太简单

但是,作为一般开发者,我还是推荐先写出算法思路。

举个例子,55. 跳跃游戏

我更加期望你能够这么在稿纸上写(当然你没有必要写这么多的字):

我们从开头开始遍历整个数组,并且维持一个最远距离值 max, 在遍历过程过,我们需要不断更新目前可以跳到最远的位置,也就是 max。

在遍历过程中,我们需要判断看当前位置是否小于等于 max:

- 如果是,继续下一个位置

- 如果大于 max,则表示无法到达最后一个位置

遍历结束可以在访问到最后一个元素或者通过判断 max 是否大于最后位置。

有了思路,我们写代码的时候往 bug free 就更进一步了

解题第四步:考虑边界情况

在有了思路之后,还需要提前考虑所有的边界情况以及初始情况。就拿上面的 55. 跳跃游戏 来讲,边界情况就是数组为空的时候:if(!nums.length) return true;

初始情况就是下标为 0 的时候:let max = nums[0] + 0;

最后代码就出来了:

/**

* @param {number[]} nums

* @return {boolean}

*/

var canJump = function(nums) {

if(!nums.length) return true;

let max = nums[0];

for(let i = 1; i < nums.length; i++) {

if(max >= nums.length - 1) return true;

if(i > max) return false;

max = Math.max(max, i+nums[i]);

}

return true;

}

整个解题过程快的话不会超过 5 分钟,后面我们可以在不断优化我们的解法,比如:

var canJump = function(nums) {

if(!nums.length) return true;

let len = nums[0];

for(let i = 0; i <= len; i++) {

len = Math.max(len, nums[i] + i);

if(len >= nums.length-1) return true;

}

return false;

};

JavaScript 刷算法题的劣势

用 JavaScript 做 leetcode 算法题或比赛的劣势是有不少的,基本处于所有语言的底层。效率比不过 java, c++ 这类静态语言(这意味着同样的测试集可能 C++ 可以通过,但是 JavaScript 通过不了),库函数的丰富性比不上 Python 这类动态语言(意味着我们需要自己编写很多功能函数)。下面我需要列举下在 JavaScript 比赛中的劣势:

1. 申请大容量的数组

在 JavaScript 中,由于 Array 可以存储任何类型数据,所以其开销往往会比静态语言大些。如果你申请的容量过大,很容易超出 v8 的最大可分配空间,我们此时又不能用 node 手段 hack。

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

06)]
[外链图片转存中…(img-P14AQNmv-1710915654907)]
[外链图片转存中…(img-tOANHOv4-1710915654907)]
[外链图片转存中…(img-iEkQ7sYG-1710915654908)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-LfbtquMd-1710915654908)]

  • 18
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值