1. 首页
  2. Leetcode经典148题

leetcode100斩回顾

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

leetcode100斩回顾

为什么开始刷题?

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

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

刚开始的感觉

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

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

尤其是Input: "25525511135" Output: ["255.255.11.135","255.255.111.35"]

leetcode100斩回顾

leetcode100斩回顾

刷题的收获

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

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

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

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

leetcode100斩回顾

leetcode100斩回顾

leetcode100斩回顾

leetcode100斩回顾

上边是最近加的一些人,每次收到别人的称赞自己也会很开心。此外,博客是直接放在 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 搭建的,我觉得上边「搜索」的插件很好用,可以直接根据关键字搜出来自己想做的题。

leetcode100斩回顾

知乎专栏也会同步更新:

阅读全文

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:leetcode100斩回顾

    链接:https://www.javajike.com/article/3236.html

« leetcode-99-Recover-Binary-Search-Tree
leetcode-100-Same-Tree»

相关推荐

QR code