Leetcode算法题分类解析:(一)总览

原文:https://blog.csdn.net/dc_726/article/details/51703014

1.为何/如何刷题

1.1 必要性

刷题刷题,从“刷”字就能看出其中的机械性和应试性,但这就是几乎所有IT公司面试中的一环。尽管面试者可能也对这种考察方式不是很满意,可在没有更好的方式之前,这个现状会一直保持下去。我们改变不了这个现状,那就适应它吧。

1.2 分类攻破

为什么要这么麻烦地分类呢?照着Leetcode的题目顺序做不就好了?个人觉得分类有几个动机:

一是找信心:一开始不幸碰到看起来简单却没思路的题真的很崩溃,心想后面还有那么多呐,怎么刚开始就卡住了?通过分类就能知道这道题是典型的一类题还是只是一道很细节的题甚至“奇技淫巧”。
二是提高效率:有时吃透一道题就可以解一大类。这真的跟以前上学时的备考很像,回忆一下更遥远的小学时的应用题大全那本神书。
三是题目整理:目前在网上看到的都是Solution,没有只是题目或者与Solution分开的版本。为了方便思考和学习,就单独整理了这么一份只有题目和思路的版本。
所以,建议大家都根据自己的理解进行分类,大体上应该都差不多,可以根据个人喜好微调。最好在一段时间内,集中解决同类问题来强化学习,而不是东一榔头西一棒子。

1.3 特点分析

通过题目的整理,可以看出Leetcode试题有几个特点,可能也适用于大部分面试题:

问题背景简单:问题描述都比较简单几句话就能说清,只有少部分题目比较复杂比较难,例如基于棋盘、柱型图、正则表达式等等。
数据结构选定:大多直接给定数据结构,在其上设计一个简单的算法。当然这不绝对,当题目对时间复杂度要求很高时,就要用空间换时间,这时也是要选取额外的数据结构的。
代码量小:一般在30-40行左右,因为面试时还要分析性能和证明正确性,所以不太可能让我们去写很多代码的。
考察基础:既然问题描述简单、数据结构给定、代码量还小,那还考什么呢? 
4.1 基础数据结构:真的是基础,80%~90%都围绕着数组、链表、树、字符串进行。图很少,高级数据结构更是没有。有应该也只是考知识面吧,不可能让现场实现。 
4.2 常用算法设计:以二分查找、快速排序、归并排序为骨架扩展,活用哈希,应用分治、贪心、组合算法、动态规划等重要设计方法。同样地,高级的像什么随机化啊、外部存储、并行算法都没有。 
4.3 简单分析能力:能在实现之后给出执行性能和正确性的分析和理由。 
4.4 逻辑思维能力(小逻辑):在前两者基础上写代码,也就是所谓的小逻辑,需要的就是比较强的逻辑思维、代码熟练度。 
4.5 考虑周全度(Corner Case):题目不提的东西不代表不要求,所以各种Corner Case都要考虑到,不然在Leetcode上Submit时就会被打回,面试时可能也会被质疑。
1.4 参考资料

下面就重点推荐一些刷题辅助资料:

Solution:官方付费的和GitHub上民间的都有,可以参考看看自己哪里写的不简洁。
基础数据结构:因为很多算法只有伪代码,Knuth高徒Sedgewick的《Algorithms in C》是不错的参考。
性能分析:简单学习应用的话自己看看常见的渐进复杂度就可以了,毕竟要分析的代码都比较简单。要说严谨分析推导的话,就一定要看CLRS的《Introduction of Algorithm》。
正确性证明:简单了解的话就看看不变量(Invariant)就行了。但有时被这些“小逻辑”搞得真的很失落,明明很简单可就是总写错。要想深入的话,《The Science of Programming》貌似是唯一的权威,源自Dijkstra的《A Discipline of Programming》。
贪心算法:应付面试的话就掌握几个典型问题就可以了。再进一步学习的话,《Algorithm Design》是个不错的选择,有一章对贪心和其典型问题的应用讲解的挺深入。
组合算法:红宝书《The Algorithm Design Manual》是少有的有专门章节讲组合算法(Combinatorial Algorithm)。
动态规划:这一部分不知道哪本书更好,几乎大部分算法书都有专门的章节讲。
此外,市面上还有些不错的面试书,其中题目应该部分与Leetcode重合,而且还包含非面试方面的准备工作,可以作为补充:

Crack the Code Interview(CtCI):看了前半部分,对面试的方方面面能提前有个大体了解,还是非常不错的。
Exposed Programming Interview:还没看,据说有点太简单了。
Elements of Programming Interview:一本新出的书,评价非常高,从美亚上的评论就能看出,准备刷完Leetcode后补充学习一下。
1.5 这只是刷题

就像应试一样,千万别以为刷题是万能的。算法功力的提高则完全是另一回事了,从这些书和题库只能找到些许算法设计的感觉,而真正的提高还在于深入的学习。所以切忌,“捷径”也是一把双刃剑!但话说回来,有剑总比无剑好一些,所以题还是得刷的:)

下面就是我整理的分类了,后续的Blog就按这个顺序进行分类解析,希望能坚持做完150~200基础题。

基础(Foundation) 
1.1 数组和链表(Array&List):插入、删除、旋转等操作。 
1.2 栈和队列(Stack&Queue):栈的典型应用。 
1.3 树(Tree):构建、验证、遍历、转换。 
1.4 字符串(String):转换、搜索、运算。 
1.5 二分查找(Binary Search):查找位置、范围等。
设计(Design): 
2.1 积木块(Building Block):哈希、分治、排序。 
2.2 组合算法(Combinatorial Algorithm):回溯、组合、排列、子集。 
2.3 贪心算法(Greedy Algorithm):贪心的典型应用。 
2.4 动态规划(Dynamic Programming):广泛应用DP求最优解。
杂项(Misc): 
3.1 数学(Math) 
3.2 位运算(Bit Manipulation) 
3.3 矩阵(Matrix)
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值