学习算法,不要一上来就开始啃《算法导论》,毕竟这本书并不适合新手学习,如果你之前的算法基础比较薄弱,只会一直陷在“拿起来又放下”的循环里。可以怎么入门呢?建议还是看书+实战,实战当然也不是说要去肝ACM或者是topcoder什么的。
如何学习算法?
算法,其实可以分为三种。算法、面试算法、竞赛算法。
算法
也就是算法本身,推荐一些书籍。
1.入门系列:
《算法图解》:“像小说一样有趣的算法入门书”,主打“图解”,通俗易懂
《大话数据结构》:把理论讲得有趣不枯燥;每个数据结构和算法,作者都结合了生活中的例子,能让你有非常直观的感受。
2.教科书系列:
《数据结构与算法分析》:很多大学都拿它当作教材,非常系统、全面、严谨,适合掌握了至少一门编程语言的同学。作者也很贴心,这本书有三种语言的版本:《数据结构与算法分析 : C 语言描述》《数据结构与算法分析 : C++ 描述》《数据结构与算法分析 : Java 语言描述》。
3.进阶之旅:
《算法导论》:有了一定基础之后,就可以开始啃这本大部头了。
4.扩展阅读:
《算法之美》:算法科普,从生活中的各种问题说起:租房、谈恋爱、老虎机、拍电影、面试、买彩票、各种排序、找停车位、寻找新药、临床试验、奥巴马拉赞助、预估电影票房等等,非常生活化,可以作为补充阅读。《算法帝国》:同样是科普类书籍,并无涉及算法的原理与实现细节,也可以作为补充阅读。
5.殿堂级
《计算机程序设计艺术》:包含很多卷,深度、广度、系统性、全面性是其他所有数据结构和算法书籍都所无法相比。可以当做一种挑战~
竞赛算法
算法学习最好由浅入深,先了解算法思维,再去理解实际应用;当逐步全面的掌握相关知识体系,有一定实践经验后,可以去参加一些竞赛提升自己的算法能力。竞赛算法是比较锻炼人的,对于竞赛来说,每道题对输入参数和样本量的要求都非常明确,包括对空间的限制和运行时间的限制也规定的非常明确。
每一个竞赛选手都非常熟练怎么根据这些提前给好的限制,反推出自己需要实现一个什么样复杂度的解法才能通过。所以对思维和逻辑上的锻炼是非常有效的。
一些比较常见的经典算法题目:
数学
尾部的零
斐波纳契数列
x的平方根
x的平方根 2
大整数乘法
骰子求和
最多有多少个点在一条直线上
超级丑数
比特位操作
将整数A转换为B更新二进制位
二进制表示
O(1)时间检测2的幂次
二进制中有多少个1
动态规划
编辑距离正则表达式匹配
交叉字符串
乘积最大子序列
二叉树中的最大路径和
不同的路径
通配符匹配
堆
滑动窗口的中位数数据流中位数
最高频的K个单词
接雨水
堆化
排序矩阵中的从小到大第k个数
二叉树
二叉树中序遍历二叉树的序列化和反序列化
子树
最近公共祖先
二叉树的层次遍历
将二叉树拆成链表
在二叉查找树中插入节点
二分法
经典二分查找问题二分查找
两数组的交
区间最小数
寻找旋转排序数组中的最小值
搜索排序区间
寻找峰值
分治法
快速幂两个排序数组的中位数
合并K个排序链表
哈希表
变形词子串哈希函数
短网址
复制带随机指针的链表
最小子串覆盖
矩阵
搜索二维矩阵旋转图像
岛屿的个数
螺旋矩阵
宽度优先搜索
克隆图被围绕的区域
拓扑排序
单词接龙
链表
实现一个链表的反转链表求和 II
删除链表中的元素
LRU缓存策略
合并两个排序链表
两个链表的交叉
翻转链表 II
复制带随机指针的链表
带环链表
枚举法
统计数字名人确认
最长连续上升子序列
最大子数组差
最长公共前缀
排序
快排摆动排序
最大间距
最接近零的子数组和
最大数
四数之和
数组划分
第K大元素
排颜色
深度优先搜索
N皇后问题图是否是树
带重复元素的排列
分割回文串
数组
数组划分逆序对
合并区间
搜索旋转排序数组
最大子数组
删除排序数组中的重复数字
第二大的数组
先递增后递减数组中的最大值
两数和 - 输入的数据是有序的
两个排序数组的中位数
在大数组中查找
颜色分类
合并排序数组
无序数组K小元素
中位数
奇偶分割数组
贪心
主元素寻找缺失的数
买卖股票最佳时机
加油站
删除数字
落单的数
最大子数组差
线段树
线段树查询线段树的构造
线段树的修改
区间求和
统计比给定整数小的数的个数
栈
带最小值操作的栈用栈实现队列
有效的括号序列
简化路径
整数
反转整数将整数A转换为B
整数排序
字符串处理
罗马数字转整数回文数
乱序字符串
有效回文串
翻转字符串
最长无重复字符的子串
字符串压缩
比较字符串编辑距离II
作者:九章算法
链接:https://www.zhihu.com/question/19981544/answer/747832788
来源:知乎
本站内容未经许可,禁止任何网站及个人进行转载。