一、算法面试的准备范围
基础算法和数据结构
- 排序算法
- 基础数据结构和算法的实现:如堆、二叉树、图
- 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集...
- 基础算法:深度优先、广度优先、二分查找、递归...
- 基本算法思想:递归、分治、回溯搜索、贪心、动态规划...
二、解决算法面试问题的整体思路
1、阅读题目
a、当有条件提示时:
- 给定有序数组
- 二分查找?
- 有些题目的条件本身就是暗示
- 设计一个O(nlog(n))的算法
- 分治
- 树排序
- 设计一个O(nlog(n))的算法
- 无需考虑额外的空间
- 考虑开辟额外空间
- 数据规模大概是10000
- O(n2)
b、当没有思路时:
- 利用简单的数据测试用例试验一下
- 不要忽视暴力解法,暴力解法通常是思考的起点
- 暴力 -> 优化
2、算法优化:
- 遍历常见的算法思路:
- 索引指针
- 递归
- 分治
- 贪心
- 动态规划
- 遍历常见的数据结构(复杂算法的辅助)
- 栈
- 队列
- 堆
- 树
- 图
- 常规思路
- 空间换时间(哈希表)
- 数据预处理(排序)
- 在瓶颈处寻找答案
- 如:O(nlogn) 预处理 + O(n^2) 数据处理;O(n^3),通常都是在复杂度高的部分进行优化,即在瓶颈处优化。
3、实际编写
-
极端条件的判断
- 数组为空?字符串为空?数量为0?指针为NULL? -> 代码健壮性
-
变量名
-
模块化、复用性