算法如何刷题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法如何刷题相关的知识,希望对你有一定的参考价值。

参考技术A 1、原题
我自己感觉原题的概率还是挺大的,特别是剑指offer的66题更是如此。千万别小看这66题,这几十道题里面基本所有的算法类型都有包括在内,常用的数据结构,操作方式,常用算法思路都有不少的题。

如果真的能够充分理解这几十道题的最优解,我感觉其实已经形成基本的算法思维了。

另外,leetcode的原题也很常见,因为LC本身题量大,在里面出原题不是为了考倒你,而是检验你的刷题质量。

毕竟那些大公司面试官也不是傻子,知道你在面试前肯定会大规模刷题的。所以把刷过的题完全搞懂才是最重要的。

2、改编题
改编题就很显而易见了。改编题大多需要从基本的算法原理中找到处理的思维,然后结合实际题干进行性能优化,就能够搞定。

这里要记得一点的是,正常的算法考察不会故意刁难你(正常情况),也不会给过多的时间让你思考和敲代码。

所以遇到改编题不要想得太复杂,尽量要找到它的算法思维是什么。怎么说呢,透过现象看本质。我总结的改编题有以下几种思路:

1)新的数据结构,换汤不换药。比如最常见的排序算法的改编,原来是对数字进行排序,现在对链表排序等等。比较难一点的可能会遇到自定义的数据结构。但是算法本质不会变。

2)算法类型改编。

这里要说的就是一个比较大的范围,比如动态规划、贪心算法、递归、回溯和分治等等。这种是从算法大的类型上进行改编,很难用相同的套路去解题。

遇到这类题的关键就是要先弄明白算法核心。比如动态规划的状态方程,贪心算法的局部最优情况,递归回溯的边界判断,分治的子问题划分等等。这种类型的确比较难把握,怎么硕呢,每种类型的都来搞几道感觉感觉吧。

3)添加应用题背景。

这种题目看起来不难,但是难就难在对应用题背景的理解,需要去理解题意,然后考虑合适的数据结构和处理算法。这里面有数学建模的思维在里面,需要把一堆无用的信息剔除,筛选出有效的信息,然后才能选择正确的算法。

3、创新题
这类题考察的是你的扩展思维,如果说上面的题考查的是你的思维深度,这种题就是考察算法的广度。可能一看题目,完全没见过这种类型。但是算法本身其实不就是让计算机代替人脑进行高重复性的计算嘛。

首先你需要想到你应该去怎么算这个题,然后再换到计算机上,会发生什么问题(空间时间问题,运行效率,代码冗余等等),之后再想通过经典的算法原理来解决这些

1、题型分类
按照个人的习惯,喜欢按照一种类型狂刷,然后再刷另外一种类型。一般常见的算法类型可分为:

数组、链表

包含基本排序算法、二分查找、链表的一系列操作。

栈、队列、堆

利用栈、队列互相实现,堆的使用

二叉树与图

主要是遍历算法和节点的计算:
二叉树四种遍历方式、广度优先遍历(BFS)和广度优先遍历(DFS),节点到节点距离等等。

哈希表

使用标准库自带的模板或者函数就很简单了,一般会与其它数据结构相结合来提升时间复杂度。

字符串操作

字符串的操作也很多,本质上可以看作是数组的操作。另外字符串的一些匹配和寻求字串的算法还是非常具有思考价值的。KMP,马拉车等等。

递归

重点掌握边界判断条件。

回溯

重点掌握边界判断条件。

分治

重点掌握如何划分子问题。

动态规划

题太多了,可从一阶dp到二阶dp理解不同的状态方程。

贪心及其它

这个就很容易理解了,遇到贪心题应该要偷笑了。

2、高频热点多刷
这不多说了吧,Leetcode热题HOT 100。你值得拥有。

在不知道怎么刷的情况下,不如先刷起来。刷个题没那么多捷径,只有坚持刷起来了,才会形成自己的思维方式和学习习惯。

我建议是先按照类型刷,每个类型刷十几二十道。然后打混按照算法热度排序重新查漏补缺。

3、思路回顾
许多同学在一股脑刷了很多题之后,再看做过的题会发现忘了不少。可能大家都是这样的吧。我觉得是因为在刷题的时候过于心急,理解了大概就过了,或者类型做的太杂,没有留下印象。

我比较喜欢的方式是偶尔会重新看看曾经做过的题,就看题目然后想思路,再画一画步骤演进,没时间就不细敲了。这样可以增强一下思维记忆,之前理解过的东西,再回忆起来还是非常快的。

刷题时,遇见过哪些巧妙的贪心算法的题目?

算法小白闭眼进,给大家介绍一个有趣的、过程详尽的贪心算法的例子:加勒比海盗船——最优装载问题


刷题时,遇见过哪些巧妙的贪心算法的题目?

在北美洲东南部,有一片神秘的海域,那里 碧海蓝天、阳光明媚 ,正是传说中海盗最活跃的 加勒比海(Caribbean Sea) 。有一天,海盗们截获了一艘装满各种各样古董的货船,每一种古董都价值连城。

虽然海盗船足够大,但载重量为c,每件古董的重量为 刷题时,遇见过哪些巧妙的贪心算法的题目? ,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?


01



问题分析

根据问题描述可知这是一个可以用心算法求解的最优装载问,要求装载的物品的数量尽可能多,而船的容量是固定的,那么优先把重量小的物品放进去,在容量固定的情况下,装的物品最多。


采用重量最轻者先装的贪心选择策略,从局部最优达到全局最优,从而产生最优装载问题的最优解



02



算法设计

(1)当载重量为定值c时, 刷题时,遇见过哪些巧妙的贪心算法的题目?越小,可装载的古董数量n越大。只要依次选择最小重量古董,直到不能再装为止,即可。


(2)把n个古董的重量从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前 i 个古董,直到不能装为止,此时达到最优。



03



完美图解

假设古董如下图所示:

刷题时,遇见过哪些巧妙的贪心算法的题目?
古董图片
每个古董的重量如表2-1所示,海盗船的载重量c为30,那么在不能打碎古董又不超过载重的情况下,怎么装入最多的古董?

刷题时,遇见过哪些巧妙的贪心算法的题目?


(1)因为贪心策略是每次选择重量最小的古董装入海盗船,因此可以按照古董重量非递减排序,排序后如表2-2所示。

刷题时,遇见过哪些巧妙的贪心算法的题目?


(2)按照贪心策略,每次选择重量最小的古董放入(tmp代表古董的重量,ans代表已装载的古董个数)。

刷题时,遇见过哪些巧妙的贪心算法的题目?



04



完伪代码详解

(1)数据结构定义


根据算法设计描述,我们用一维数组存储古董的重量:

刷题时,遇见过哪些巧妙的贪心算法的题目?


(2)按重量排序


可以利用C++中的排序函数sort,对古董的重量进行从小到大(非递减)排序。因此,要使用此函数需引入头文件:

刷题时,遇见过哪些巧妙的贪心算法的题目?


(3)按照贪心策略找最优解


首先用变量ans记录已经装载的古董个数,tmp代表装载到船上的古董的重量,两个变量都初始化为0。然后按照重量从小到大排序,依次检查每个古董,tmp加上该古董的重量,如果小于等于载重量c,则另ans++;否则,退出。

刷题时,遇见过哪些巧妙的贪心算法的题目?刷题时,遇见过哪些巧妙的贪心算法的题目?



05



实战演练

刷题时,遇见过哪些巧妙的贪心算法的题目?

  ▌ 算法实现和测试

(1)运行环境

Code::Blocks


(2)输入

刷题时,遇见过哪些巧妙的贪心算法的题目?刷题时,遇见过哪些巧妙的贪心算法的题目?


(3)输出

刷题时,遇见过哪些巧妙的贪心算法的题目?


  ▌ 算法解析及优化拓展


01、算法复杂度分析

刷题时,遇见过哪些巧妙的贪心算法的题目?


02、优化拓展

刷题时,遇见过哪些巧妙的贪心算法的题目?

以上内容来自《趣学算法》,作者陈小玉


陈老师近期又为大家送福利了,金三银四:算法春招面试专场公开课,前200名正在免费报名中!


3月23日晚8:00开课
刷题时,遇见过哪些巧妙的贪心算法的题目?

作者:人民邮电出版社
链接:

来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

-END-

刷题时,遇见过哪些巧妙的贪心算法的题目?

Epubit   Welfare

异步福利


邀请好友关注“异步图书”领取纸书1本,立刻填表抢座。



刷题时,遇见过哪些巧妙的贪心算法的题目?




扫码关注「异步图书
聊聊图书背后的故事

回复“进群”入群领新手福利
异步VIP会员、技术分享、学习交流、赠书活动

以上是关于算法如何刷题的主要内容,如果未能解决你的问题,请参考以下文章

十一月计划

我也曾刷题刷到自闭

我也曾刷题刷到自闭

我也曾刷题刷到自闭

i学刷题刷时长自动刷课软件插件分享

雨课堂刷课件刷题刷视频插件分享