算法面试不代表“正确”回答每一个算法问题,合理的思考方向更重要
把这个过程看作是和面试官一起探讨一个问题的解决方案,对于问题的细节和应用环境,可以和面试官沟通
“正确”本身是一个相对的概念,比如对一组数据进行排序,不能忽略应用环境,一味的选择速度快的快速排序法等等,而是根据具体情况选择更优的算法
要先看看这组数据的特征,重复元素较多可以选择三路快速排序法,有序性较高可以选择插入排序法,取值范围非常有限可以选择基数排序法,要求排序性能很稳定可以选择归并选择法,完全随机的数据可以选择普通的快速排序法
还要看看数据的存储结构是什么,比如快速排序法要求数据的随机化程度高,而使用链表存储的数据就更适合用归并排序法
如果数据量很大,不足以装载在内存里,需要使用外排序算法
不要轻视基础算法和数据结构,
比如各种排序算法
基础数据结构和算法的实现如堆、二叉树、图
基础数据结构的使用如链表、栈、队列、哈希表、图、Trie、并查集
基础算法如深度优先、广度优先、二分查找、递归
基本算法设计思想如递归、分治、回溯搜索、贪心、动态规划...
要在学习和做题中找到平衡,不能一味的刷题而不理解其背后的思想,刷题不是目的
如给定一个有序数组,则可能使用二分查找法更好
设计一个O(nlogn)的算法,则可能先进行排序,再进行后序操作
无需考虑额外的空间,则可能需要开辟额外的空间来换取时间的性能
数据规模大概是10000,则可以使用O(n^2)的算法
不要忽视暴力解法,暴力解法往往是思考的起点
遍历常见的算法思路如索引指针遍历、递归、分治、贪心、动态规划...
遍历常见的数据结构如链表、栈、队列、堆、树、图...
空间和时间的交换(哈希表)
预处理信息(排序)
数组为空、字符串为空、数量为0、指针为NULL