算法题难度分级其实很简单。通常分为以下几个等级:
1. 基础题:这类题目通常在面试中占比较大,难度不大,主要考察你的编程基础和逻辑思维能力。比如,排序算法(去年我们跑的那个项目,大概3000量级就需要用到快速排序),或者简单的动态规划问题。
2. 中等题:这类题目开始涉及一些算法设计技巧,比如贪心算法、分治法等。难度上升,需要一定的思维跳跃。例如,寻找两个有序数组的中位数(其实挺坑的,很多人没注意边界条件)。
3. 困难题:这类题目通常需要深入理解数据结构和算法,解决复杂问题。比如,图算法中的最短路径问题(我一开始也以为很难,后来发现不对,其实关键在于如何选择合适的算法,比如Dijkstra或A)。
4. 高级题:这类题目往往需要综合运用多种算法和数据结构,解决极其复杂的问题。例如,动态规划与图算法的结合,解决多阶段决策问题。
等等,还有个事,很多人在准备算法面试时,容易忽视对算法原理的深入理解,而只关注刷题。其实,理解背后的门道比单纯刷题更重要。最后提醒一下,当你看到一道算法题时,先分析题目类型,再选择合适的算法来解决,这样可以提高解题效率。
LeetCode 刷题库,难度分为 Easy、Medium、Hard,Easy 题目在 10 分钟内解决,Medium 需要 30 分钟,Hard 至少需要 1 小时。
那天,我在咖啡馆里,一个朋友愁眉苦脸地抱怨他的算法题。他说,最近参加了一场编程竞赛,遇到了一道题,看了半天,头都大了。我笑着说:“别急,算法题这东西,就像登山,有平地,有陡坡,还有险峻的峭壁。”
我记得有一次,2012年,我参加了一个算法培训,那时候,我接触到了动态规划。那是一个周末,我在图书馆里,对着电脑屏幕,研究了一个下午。当时,我遇到了一个时间复杂度为O(n^2)的动态规划问题,解出来的时候,我兴奋得手舞足蹈。现在想想,那不过是入门级别的挑战。
再后来,2015年,我参加了一场国际算法竞赛。那一次,我遇到了一个需要用到图论和数论的题目。那是一道难题,我花了整整两天的时间,才勉强解决了它。那两天,我几乎没睡,每天只吃一顿饭,最后,我拿到了比赛的第一名。
等等,还有个事,我突然想到。去年,我教一个新手学算法,他一开始对递归算法一头雾水。我带他做了几个简单的递归题目,比如斐波那契数列。后来,他慢慢掌握了递归的精髓,对更复杂的算法也产生了兴趣。
所以,算法题的难度分级,就像人生一样,有起有落。重要的是,不管遇到什么难度,都要有耐心,一步一步来。你说呢?