常见面试算法题
① 面试会出哪些经典算法题
如下:
1、排序算法∶快速排序、归并排序、计数排序
2、搜索算法∶回溯、递归、剪枝技巧
3、图论∶最短路、最小生成树、网络流建模
4、动态规划:背包问题、最长子序列、计数问题
5、基础技巧:分治、倍增、二分、贪心
6、数组与链表:单/双向链表、跳舞链
7、栈与队列
8、树与图:最近公共祖先、并查集
9、哈希表
10、堆:大/小根堆、可并堆
11、字符串∶字典树、后缀树
算法简介:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。
如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
算法中的指令描述的是一个计算,当其运行时能从一个初始状态和(可能为空的)初始输入开始,经过一系列有限而清晰定义的状态,最终产生输出并停止于一个终态。一个状态到另一个状态的转移不一定是确定的。随机化算法在内的一些算法,包含了一些随机输入。
形式化算法的概念部分源自尝试解决希尔伯特提出的判定问题,并在其后尝试定义有效计算性或者有效方法中成形。
这些尝试包括库尔特·哥德尔、Jacques Herbrand和斯蒂芬·科尔·克莱尼分别于1930年、1934年和1935年提出的递归函数,阿隆佐·邱奇于1936年提出的λ演算,1936年Emil Leon Post的Formulation 1和艾伦·图灵1937年提出的图灵机。即使在当前,依然常有直觉想法难以定义为形式化算法的情况。
② 算法面试题——动态规划Kadane’s algorithm
动态规划是大公司面试必考的算法题。其中,“最大子序和”是其中的经典:
面试官:年轻人,前面表现的不错嘛!看下这道题,给你这个数组[-2, 1, -3, 4, -1, 2, 1, -5, 4],找到其中和最大的连续子数组,返回最大值。
我:
使用Kadane’s Algorithm解决这个问题。Kadane’s Algorithm可以简单理解为动态规划的一种应用,它通过维护两个变量:localMax和globalMax,来计算连续子数组的最大和。localMax表示以当前元素结尾的子数组的最大和,而globalMax则记录遍历过程中发现的最大值。
我们以数组[-2, 1, -3, 4, -1, 2, 1, -5, 4]为例,从左到右遍历数组。
当遍历到元素4时,localMax为4(因为4是当前元素),globalMax也更新为4(因为这是遍历到的第一个元素)。
遍历到元素-1时,我们考虑两种情况:
1. 包括前面的元素4,即localMax更新为4 + (-1) = 3。
2. 不包括前面的元素4,即从元素-1开始新的子数组。由于-1 > 3,我们选择-1作为新的localMax。
因此,globalMax更新为-1。
遍历到元素2时,localMax为2(因为2 > 1),globalMax更新为2。
遍历到元素1时,localMax更新为3(因为3 > 2 + 1),globalMax也更新为3。
遍历到元素-5时,我们考虑两种情况:
1. 包括前面的元素3,即localMax更新为3 + (-5) = -2。
2. 不包括前面的元素3,即从元素-5开始新的子数组。由于-5 < 3,我们选择3作为新的localMax。
因此,globalMax更新为3。
遍历到元素4时,localMax为4(因为4 > 3 + 4),globalMax更新为4。
最终,我们得到数组的最大子序和为4。
动态规划和Kadane’s Algorithm在解决“最大子序和”问题时,通过维护局部最优解和全局最优解,避免了暴力算法中的重复计算,大大提高了效率。
理解Kadane’s Algorithm的关键在于,它通过比较当前元素和当前元素加上前面元素的最大和,来决定是否更新局部最优解。这样,我们不仅避免了重复计算,还能在遍历过程中不断更新全局最优解。
此外,Kadane’s Algorithm在解决类似问题时,如“买卖股票的最佳时机”,同样可以应用动态规划的思想,通过维护局部最优解和全局最优解,来找到最优策略。
动态规划和Kadane’s Algorithm是解决一系列动态规划问题的有效工具,通过理解和应用这些算法,可以大大提高解决问题的效率和准确性。