资讯专栏INFORMATION COLUMN

leetcode 100 斩!回顾

wyk1184 / 2968人阅读

摘要:斩从第题开始,到现在也差不多快一年了,回顾纪念一下。当时对回溯动态规划也都只是上课的时候学过,也并不熟练。最经典的例子就是斐波那契数列了,求第项数列的值。

leetcode 100 斩!从第 1 题开始,到现在也差不多快一年了,回顾纪念一下。

为什么开始刷题?

从大一就知道了 leetcode,但刷题总是三天打鱼,两天晒网,会发现刷过的题,隔一段时间再看还是需要很久才能再想起来,于是就萌发了刷一题总结一题的想法。

另一方面,leetcode 上的 discuss 里一些解,有时候讲解的很少,甚至只丢一些代码,对于我等这种菜鸟有时候看的太废劲了,所以不如自己把各种解法都理清楚,然后详细的总结出来,也方便其他人更好的理解。

刚开始的感觉

大一的时候,听过 ACM,然后暑假也去学校的 ACM 集训试了试,但当时基础太差了,栈和队列都不知道是什么,所以也就没有走上 ACM 的道路。之后就各种学安卓、web、后端的应用开发的一些东西了。后来准备开始刷题是大四毕业的时候了吧。

当时对回溯、动态规划也都只是上课的时候学过,也并不熟练。开始几题的时候,也都很慢,很多都自己想不出来。然后就去看别人的题解。看完以后,就什么都不看,然后按自己的思路再写一遍代码。

尤其是第 5 题,求最长回文序列,现在都印象深刻,记得当时用了好几天才把所有解法总结了出来。

所以大家如果想刷题的话,也不用怕自己基础不好,大不了哪些名词不会就去查,一点点积累就可以,重要的是开始和坚持。

现在的感觉

从开始可能只是觉得该刷一刷题,到现在可能真的是爱上了刷题。

现在刷题基本可以想出一种思路,有时候甚至和最优解想到了一起,还会想出一些别人没有想到的解法,这种成就感可能就是打游戏超神的感觉吧,哈哈。

此外,看 discuss 的时候,每当看到令人拍案称奇的思路的时候,真的是让人心旷神怡,开心的不得了,就像中了彩票一样的开心,赶快去和同学分享。

有时候也会看到一些让人捧腹的评论,题目是输入一个字符串,输出所有可能的 ip 地址。

Input: "25525511135"
Output: ["255.255.11.135","255.255.111.35"]

刷题的收获

在总结的过程中,因为力求给他人讲懂,在理清思路的动机的过程中,会发现之前的想法可能是错的,会总结着总结着就明白了另一种解法,或者产生新的想法,或者明白各个解法相互之间的联系,会比仅仅 AC 多出很多收获。

从理清他人的想法,再到自己写出代码,再到把各个解法用自己的理解串起来,会有一种「纸上得来终觉浅,绝知此事要躬行」的感觉。有时候虽然大的框架有了,但是小的细节方面还是需要自己去体会。为什么加这个 if?为什么是小于等于?每一句代码的产生都是有原因的,绝不会是可有可无的代码。

所以虽然一道题从看题,理解,自己考虑,看别人解法,到重新实现,再到总结出来,可能需要 3、4 个小时,甚至 5、6 个小时或者更多,但我觉得是值得的。

此外,也有很多人加自己的微信过来亦或是感谢自己,亦或是指出错误,亦或是询问问题,亦或是没说过话的,哈哈。有微软、谷歌、百度、阿里、腾讯的大佬,有各个大学的学生,甚至巧的是还能加上高中的校友,世界真小,哈哈。

上边是最近加的一些人,每次收到别人的称赞自己也会很开心。此外,博客是直接放在 github 上的,目前也有 280 stars 了,是自己 github 上 start 数最多的项目了,说来也惭愧,希望以后自己努力可以有一个好的开源项目。

刷题的理解

一些人可能会纠结用什么语言去刷,其实没必要纠结的。刷题需要考虑的是算法,而不是语言。算法就像是从家里到超市该怎么走?出门左拐,右拐直走….而语言是我们选择的交通工具,骑车?步行?开车?平衡车?每种交通工具都有自己的优点和缺点,语言也是如此。而好的算法可能更像是,我们偶然发现了一条近路,降低了我们的时间复杂度或者是空间复杂度。

刷了 100 道题了,我觉得必须要掌握的就是递归的思想了,利用这个思想可以解大部分的题了。计算机擅长的就是记忆以及速度,而递归可以把这两个优势发挥到极致。遇到问题以后,我们可以考虑如何把大问题分解成小问题,想出来以后,代码很容易就出来了。

此外,一些递归可以用动态规划的思想改写,从而优化递归压栈所消耗的时间,递归是顶部到底部再回到顶部,而动态规划通过存储,直接从底部到顶部解决问题。

最经典的例子就是斐波那契数列了,求第 n 项数列的值。

斐波那契数列,指的是这样一个数列:1、1、2、3、5、8、13、21、34 …… 在数学上,斐波纳契数列定义如下:F ( 0 ) = 0,F ( 1 ) = 1 , F ( n ) = F ( n - 1 ) + F ( n - 2 )(n >= 2,n ∈ N*);

如果用递归的思想去写,代码简洁而优雅。

long Fibonacci(int n){
   if (n == 0)
        return 0;
   else if (n == 1)
        return 1;
   else
       return Fibonacci(n-1) + Fibonacci(n-2);
}

当然,这样的话太慢了,优化的话,就是把递归过程的结果保存起来,或者就是改写成动态规划,最强的是其实是有一个公式的,直接利用公式就可以。

此外,还有一些题目就是根据题目的理解去写代码了,没有什么特殊的技巧。

未来的打算

当然是继续刷下去了,很开心,每天不刷一刷题会不习惯的,希望大家也早日感受到刷题的乐趣,哈哈。

在线地址:https://leetcode.wang,域名也比较好记,希望对大家会有帮助。

我是用 gitbook 搭建的,我觉得上边「搜索」的插件很好用,可以直接根据关键字搜出来自己想做的题。

知乎专栏也会同步更新:https://zhuanlan.zhihu.com/le...。

越努力,越幸运,共勉。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75366.html

相关文章

  • 极简爬虫攻防战纪要

    摘要:极简爬虫攻防战纪要爬虫是构建搜索引擎的基础负责抓取网页信息并对网页识别分类及过滤。爬虫方终于锁定了第一场战役的胜局由于断崖式技术的出现,反爬方在浏览器识别战役上望风披靡。经过反爬方的精心运作,逐渐有效削弱了敌方的攻势。 极简爬虫攻防战纪要     爬虫是构建搜索引擎的基础, 负责抓取网页信息并对网页识别、分类及过滤。我们熟识的电商、搜索、新闻及各大门户网站都有强大的爬虫集群在每...

    elliott_hu 评论0 收藏0
  • LeetCode】贪心算法--划分字母区间(763)

    摘要:写在前面今天这篇文章是贪心算法系列的第三篇划分字母区间。前文回顾贪心算法分发糖果刷题汇总汇总贴今日题目字符串由小写字母组成。返回一个表示每个字符串片段的长度的列表。示例输入输出解释划分结果为。每个字母最多出现在一个片段中。 写在前面 今天这篇文章是贪心算法系列的第三篇--划分字母区间。 前文回顾: 【LeetCode】贪心算法--分发糖果(135) 刷题汇总: 【LeetCode】汇总...

    honhon 评论0 收藏0
  • Leetcode】79.单词搜索

    摘要:题目给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中相邻单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中相邻单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允...

    Caicloud 评论0 收藏0
  • Leetcode】79.单词搜索

    摘要:题目给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中相邻单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中相邻单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允...

    ruicbAndroid 评论0 收藏0
  • 前端跳槽面试算法——动态规划

    摘要:我记得大三参加腾讯的校招面试时只准备了几种常见的排序算法就足以应对了,然而今年包括今日头条在内的多家大厂的前端笔试题目中都出现了贪心算法动态规划分治算法等进阶性的算法题目。本篇博客参考今日头条银国徽老师的《js版数据结构与算法》Part1改编自《漫画算法》原作者:程序员小灰前言众所周知,与后台开发人员相比,算法是我们前端开发人员的一个弱项。而近两年随着互联网行业竞争愈发激烈,市场上对前端岗位...

    mushang 评论0 收藏0

发表评论

0条评论

wyk1184

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<