leetcode刷题第一次总结

背景

非计算机科班,大一学过一点数据结构与算法,基本没学会,水平停留在知道链表、二叉树等这些基本的数据结构什么意思,但让我实现,一时半会折腾不出来。更不要提什么dfs、bfs,只知道个概念,遇见题都不知道要用这些思想。我的工作面试有时候会涉及算法,所以还是想花点功夫把这块钻研一下。
两年前毕业找工作的时候,刷了大概50多题,写的很痛苦,但是也没太大长进,停留在这道题要用递归,但是为啥要用也不明白,不用递归怎么解也不知道。大概半年多前看了UCB的cs61b,学了java,然后开始刷题练,发现自己两年前的面试原题,当时面试还写出来过了面试的,现在居然写不出来了。深刻认识到自己的基础太差,开始认真刷题(但是拖拉的本性还是没改掉。。。

开始

刚开始也不知道咋办好,想说犹豫半天也没啥用,上手写呗,然后就每天晚上写个3题,有时候精神点就做点难的,有时候实在懒就做个简单的。这个时候cs61b其实上到一半,才堪堪看完数据结构的部分,算法还一点都没有涉及。所以状态是基本的List啊stack啊Set啊Map啊还是会用的。由于自己水平实在差,刚开始我都不打算想最优啊什么的,我就要求自己必须写个暴力解法模拟我的手动过程把题解出来,一般暴力解法会time out,也有时候我连暴力解法都有bug,就得自己慢慢想到底哪里写的不对。然后看着暴力解的代码想怎么优化。这个阶段一般自己是想不出来的,所以时常在discuss里面或者google找我能看的懂的解法,然后看着我的暴力解想怎么往优化的方法上面靠。更多的时候全盘推翻我的暴力解,模仿别人的代码算法,自己写。很多时候自己看明白了别人的算法,但是轮到自己写了,还是写不出来。。。所以有的题,写了好几遍。。。
这个时候也发现cs61b只看一半是不够的,所以做题遇到我不太清楚的算法,我就回去看cs61b的材料。我跟的是Josh这个教授的版本,个人认为这是我遇到的讲cs讲的最清楚的老师了!非常推荐!我记得本科的时候有个算法是找最优路径,dijistra算法,我当时真的就是觉得这个名字好搞笑,至于算法是啥意思,从来没理解或者记住过,直到现在我在cs61b里面再学了一遍,才明白。
这个阶段非常痛苦的,一个题,不管标注的是简单还是难,基本对于我来说都是新的,都难,不同的题不同的知识点,都得一个一个抠。

中途

蜗牛慢慢刷题,这时候刷到七八十题的样子了,终于赶到了我两年前的进度。。。这时候也发现自己开始有新的问题了,就是对于同一个算法,知道哪些情况要用了,但是真正自己上手写,每次都要想老半天。写出来的代码也不好看,丑,自己下次看也不一定看的懂。还有每次都会出点错,每次找个错都找个一个小时以上,非常崩溃。以为自己现在已经懂了一点了,结果写起来还是不能行云流水。举个简单的例子,binary search,那个左边右边不断缩小一半距离,我有的时候写 left = mid + 1,有的时候写left = mid;那个循环条件,有的时候写left < right,有的时候写 left + 1 < right,每次都会出错,每次都是什么加1减1没想明白。这时候我意识到,我对于每个算法抠的还不够细。既然算法描述的是某一类问题的统一解法,以及现在很多软件包都封装好这些算法,别人写的东西是可以用在同一类的不同问题上的,那我做同一个类型的题,抛开具体问题细节,算法实现可以是一样的。
想明白这个,我就把刷题停了一段时间。这段时间,我主要去翻了之前做过的题,同一个类型,用同一种算法的,揪出来看代码上有什么可以统一的,然后每个算法总结一个模版。其实看别人代码的时候,看多了也发现,好看的代码好多结构上的东西都是一样的,把它们抠下来就可以照抄到下一题上面去了。
虽然模版这种东西对于大神而言,可能很低级,但是对于我这种小菜鸟,真的可以节省很多找错的时间,和很多绕进死胡同的脑细胞。但是我觉得刚开始自己瞎实现也是有用的,bug写的多了下次找bug也快一点了,同时也明白了模版里那些什么加1减1什么边界条件到底是为了防止哪种bug的。

继续刷

总结模版的时候,非常懒怠,速度很慢,加上工作也经常闹心,拖拖拉拉了很长时间。只能拽自己到书桌前刷刷题。这时候基础补了一点,再加上遇到自己总结过的,就翻翻笔记,看看模版,照着写写。。。原则上应该严格要求自己,不能看笔记的!这时候速度快多了,bug也少多了,出了错也大概知道毛病在哪里,改起来也快一点了。这段时间有的时候就要求自己写个4题甚至5题了。有的天因为太懒这个目标也完成不了,就周末多写一题。
同时,我也发现,有的题,它就是还得用再高级一点的数据结构,或者算法,它才过的了啊!基础知识还是不够啊!我之前觉得cs61b那么好,也没全包括啊!(当然有的概念我记得老师提了几次,但是我没有以好学生的标准严格要求自己,当时掌握基本的就满足了)不会了还得google,这时候发现好几次google的前几个都有geeksforgeeks的文章,写的挺浅显易懂的,更重要的是,有实现代码啊!对于我这种看明白了算法也不一定能写出来的人,直接的代码就跟衣来伸手饭来张口啊!所以后来我不会的数据结构算法啊啥的基本都在这个网站里面翻一翻。。。也推荐给大家。
对于这些“高级”一点的数据结构或者算法,其实弄明白了就跟基础的也没差,我们之所以觉得基础的简单一点,是因为我们用了太多次了。学习过程跟之前补基础知识一样,自己实现一遍,对于别人的代码,改成好看的样子,录入自己的笔记当成模版,下次套用模版的代码。

关于时间空间复杂度

我刚开始刷题的时候,看别人的答案,里面会有时间复杂度,那个时候还处于暴力实现就满足,或者能徒手写出正确的代码就满足的阶段,无暇顾及分析代码的时间空间复杂度。后来发现这个分析挺重要的,在优化代码的时候,为啥优化了,用啥数据结构优化的,都得想明白。关于这一块,我的经验是,自己徒手实现一下最基本的数据结构吧,什么List什么Stack什么Queue什么Heap什么二叉树啥的,你就明白为啥有的是O(n)有的是O(logn)还有别的啥的,而且印象会很深刻。

现在的进展

在理解了很多背景知识后,又刷了100多题,差不多200+了,感觉比两年前的水平,肯定高了。但是还是不熟练,有的时候知道要用啥算法写的时候疙疙瘩瘩,还得回去翻笔记。记得以前碰到面经的时候,好奇去看一眼,根本看都看不懂的,现在基本能看懂一些了。所以下面还是会继续刷一刷,熟练熟练,嗯这句话写在这里监督一下我这个懒惰的人。

我有的时候觉得,数据结构算法这种基础知识,被学校加进我的课程里,是有道理的,虽然可能不会直接对我有用,但是这种基础的知识,和数学分析,和高等代数,等等,一样,掌握了会让我在别的知识上有更深的理解和见地。后悔大学的时候没好好学,现在来补课。还是希望自己能努力学习吧,别偷懒。

weixin073智慧旅游平台开发微信小程序+ssm后端毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
python017基于Python贫困生资助管理系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值