算法很难:《那是因为你没看过这篇文章》

算法很难?那是你没找到方法

算法是特定问题求解步骤的描述算法是独立存在的一种解决问题的方法和思想,算法很重要,但算法也是学起来最难,最令人生畏的。

一、说说算法刷题方面的、一些经验和技巧

小伙伴们在刷题的时候不知道有没有遇到以下情况,拿到题目后就开始想着怎么写代码,结果写了大半天,发现越写越乱,最后就写不下去了,又或者是看到题目后,一脸懵逼,完全不知道怎么下手。学算法,刷题蛮干是不行的,需要遵循科学的技巧。

(一)、算法不是拼智商

算法不是并纯粹拼智商,“智商高”就一定很厉害?“不够聪明”就一定不行!当然不是的,算法是一种技能,是可以通过科学合理的方式训练出来的能力。智商的高低,当然会有一定的影响,但这个先天因素无法改变,而科学合理的方法是大家都可以掌握的。首要的一点,是要意识到,算法不是只拼智商的,也是可以经由后天训练习得的。

(二)、难度要循序渐进

有些同学喜欢不明所以的上来就是干,选择终极难度的题目,觉得自己只要做出最难的,其它的就迎刃而解了。这种急于求成的思想要不得。算法训练是一个系统工程,需要循序渐进,太过于急功近利,反而容易因做不出难题而产生挫败感,带来反效果。记得我有一个同事就做了次类似的事情。我们当时刚听说有leetcode,就想上去试试,他上去后就挑了一道困难里面还属于比较难的题目,结果想了大半天也没做出来,搞到自己特别沮丧。事后你会发现这种做法效率很低,那道题目就算被做出来了,也不代表就可以解出其它的题目。

(三)、合理的做法是循序渐进

如果你本身有基础,熟练度高,那你刷简单的leetcode应该是几分钟一题,几分钟一题的,花不了你多少时间。如果你刷简单都花费很长时间,说明熟练度不够,就更应该从简单开始。然后过度到中等,再过度到困难。

二、形式分析

目前国内大厂的算法考察,基本不会超过leetcode 中等难度,上限难度基本都是leetcode 中等题里面的中等难度(有点拗口,leetcode 中等难度里面也有分档次),如果你能够在20分钟内,做出这种难度的题目,国内大厂的算法面试,基本可以畅通无阻。

(一)、按算法分类来选题

选择题目,除了在难度上要循序渐进,还建议在算法上进行划分。基本的算法数据结构是有限的。比如说链表,二叉树,二分查找,动态规划,哈希表。我喜欢按算法的分类来选题和刷题,比如一个时间段,只刷链表题,待刷得差不多的时候,接下来再刷二叉树的题。这种做法可以极大的提高刷题的速度,而且能带来更好的效果。

1、持续地刷同个类型的题目,可以不断地巩固和加深理解。

2、可以更全面地接触这个数据结构,算法的各个变种,这会促使你对这个数据结构,算法的理解更加全面和深刻,学习的效率会更高。

所以在一段时间内,持续地刷特定类别的题目,可以带来事半功倍的效果。当然,在能力已经比较强的时候,可以采用打散的方式来刷题,可以更好地锻炼思维的灵活性和应变能力,但初期或能力较弱的时候,按分类选题,是比较好的。

(二)、解题三部曲

在具体做题的时候,可以采用以下三个步骤来进行,拿到题目后不要立马开干,想着下面的三个步骤,一步一步地来。

1、 看懂题目

看懂题目。有的题目很直接,直接告诉你要解决的问题是什么,题目本身甚至都包含了对应的数据结构和需要用到的算法;有的题目很隐晦,看了半天不知道它到底要解决什么问题,可以用什么算法和数据结构来解。所以,看到题目后,一定要先确保自己理解清楚了。

我的一个经验是,拿到一个题目后,看5分钟,如果5分钟之内看不懂,我就mark 下来,留到后面再做,要不很影响刷题的心情。

不过就leetcode 来说,这样的题目不多。基本都能在再5分钟内看懂。

2、分析,推导解法

  分析推导题目的解法:这个步骤要有意识地单独拎出来,不要跟编码步骤混淆在一起。也就是说,你在分析推导题目解法的时候,不要去想任何实现相关地事情,不用去想代码怎么写,不用去想要用什么库,定义什么变量,用多少层循环,都不要想,就想着在逻辑上,这道题目要怎么解。

这样做可以极大地降低你的心智负担,使你高效地想出题目的解法。对于如何将想法变成代码,可以留在下一个步骤,单独来进行。

3、将思路转换为代码

当你确定题目都已经理解,并且分析推导出了题目的解法后,你才开始来思考如何将自己的思路转换成代码。是地,将思路转换成代码,可以是一个单独地步骤,在实际工作中,其实也是很重要的一个能力。

有时,将一个思路转换成算法是很容易且自然的;但有时,有些思路转换成代码,是很有难度的事情。或者你有体会,分析推导只用了不到十分钟,结果代码写了半小时还写不完整。

怎么定义变量,保存状态,用递归,还是用循环加辅助数据结构等等,都是将思路转换成代码要做的事情,这个能力也需要刻意地去练习。

(三)、算法的封装

说点更细节的东西,算法的封装,软件设计里面,最关键的思想就是抽象和封装了。

其实解题也可以用到这种思路。

比如一道题目的正确解法是先排序,再进行二分查找,那你的脑子里面只要记得,快速排序和二分查找,就可以了,不需要去想,快速排序和二分查找的具体实现。就像我们在写代码的时候,遇到排序,查找,我们一般都直接使用了现成的函数库,而不需要自己动手再写一遍。这个是代码层面封装带来的好处,思维层面的封装也是一样的道理。

这种封装思想在做题的时候可以极大地减轻我们的心智负担,使得自己的脑力可以发挥在问题的核心点上。用封装的思维去解题,你的解题能力会有快速地提升,封装的思想可以用于 “ 2.分析,推导解法”  的过程,在 “ 3.将思路转换为代码”  的过程,更是可以用语言内置的算法函数,数据结构来直接实现,也使得从思路转换到代码的过程更加的直观和自然。

在实际的面试或比赛中,除非有特殊说明,一般都可以放心地使用语言的内置算法和数据结构,然后你可能会问,对于像排序,查找这些基础的算法应该怎么对待呢?我的建议是可以把它们当作重要算法来刻意练习。

快排,快搜,堆排序等,我们可以称它们为元算法。对于这些算法的刻意练习。一开始的时候,要看算法书的描述,确保自己理解了算法的思路,然后尝试自己实现一遍。实在写不出来,就参照或者直接抄。一个算法花几天的时间,大部分人都是可以理解并自己实现出来的。(排除一些特别难的,需要更长的时间)。

(四)、保持持续的动力

算法能力的提升,是一个长期的事情,需要持续地学习和做题,而刷题又是个比较枯燥的过程,在遇到难题的时候,很容易产生挫败感,甚至导致直接放弃。

所以这里需要特别关注刷题时的正反馈。如果你老是无法解出某个难度或某个类别的题目的时候,你就要考虑降低难度,或者安排额外的时间,去更全面的复习特定的算法和数据结构了。

注意不要死磕!算法学习,特别讲求方法和技巧,死磕非但磕不过去,还可能留下对算法的心里阴影,导致学习障碍。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容