先说stack的题目
stack的实现:链表,数组
题目:
(1)简单的:min stack,一个数组实现三个stack
(2)经典的stack问题:经典汉诺塔问题,逆波兰式计算或者产生逆波兰式,简化文件路径,验证括号对是否合法,找出最长有效括号(贪心+stack求解)
(3)涉及tree的遍历问题:tree中序遍历的迭代解法,二叉搜索树的两节点和(two sum思路)
(4)***stack排序问题***:为stack排序,从柱状图里找最大矩形(本质上类似stack排序),构造数组的maxtree(和最大矩形题目类似思路)
(5)蛋疼的其他问题:仅使用递归反转一个stack(两个递归函数,***hard***)
再说队列的题目
队列的实现:链表
题目:猫狗队列(链表合并),两个stack实现队列,数组滑动窗口的最大值(类似stack排序做,和柱状里找最大矩形题目解法有点类似,***hard***)
最后是堆的题目
题目:
(1)经典问题:合并多个有序链表,行列有序矩阵topK(k*logk解法,j+1,i+1)
(2)***需要观察总结规律的***:数组滑动窗口的最大值(使用优先级队列剔除“过期”的最大值),最大值-最小值<=num的子数组数目(滑动窗口+堆)
算法总结——数组和字符串问题
先说字符串的题目
(1)简单问题:变形词,字符判重,是否为字符串旋转,reverse字符串,字符串压缩(a3b2这种,计数器),单词替换,翻转字符串(通常两两翻转搞定),括号字符串问题(stack问题)
(2)经典问题:数字验证,字符串转数字(状态机),编辑距离(DP),公式字符串求值(python eval,本质上也是状态机实现),Trie,正则表达式匹配(递归简单,DP难)
(3)dfs:提取单词(dfs,如果是最多单词则dp),从去.字串里提取IP地址,字符串的全排列(abc、acb...使用swap+一个for)
(3)涉及二分查找问题:有序+NULL的字符串数组查找,01字符串边界问题
(4)涉及双指针问题:单词数组中两个单词的最小距离,字符串中最长不重复子串,一个字符串中包含另外一个字符串(不要求有序)的最长子串长度,
(5)DP问题:添加最少字符整体变成回文(双dp)
(6)其他:产生括号对(递归+剪枝),数字字符串相乘(用数组存进位)
再说数组和矩阵的题目
(1)简单的问题:stringbuffer,两个有序数组归并问题
(2)经典问题:topK,数组中出现次数超过一半的数字,2sum问题,prefixsum问题(数组累加和为特定值,和双指针区别,最大值的话就dp),快排partition,time range排序重叠区间问题
(3)bfs或dfs:最短通路
(3)涉及二分查找问题:行列排序的矩阵中查找(对角线二分或者右上角比较),旋转数组查找,两个有序数组合并后的中位数或kth数(难)
(4)涉及排序问题:外部排序,1~N数字排序,矩阵的topK,排序后相邻数最大差值(桶排序),数组配对(计数排序)
(4)涉及双指针问题:最长可整个子数组(子数组max-min=1),全正数数组sum为k的最长子数组
(5)DP问题:子数组最大累加和(延伸:子矩阵最打累加和),子数组的最大累积乘积
(6)其他:N*M图像旋转90度问题,矩阵行列清零,转圈(之字形)打印矩阵或者矩阵顺时针旋转90度(使用左上角右下角坐标做基准,递归),数位重组