• 算法总结——堆栈、字符串、数组类题目


    先说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度(使用左上角右下角坐标做基准,递归),数位重组

  • 相关阅读:
    【树】树的前序遍历(非递归)
    表单提交中的input、button、submit的区别
    利用setTimeout来实现setInterval
    Jquery动画操作的stop()函数
    Javascript实现简单的双向绑定
    Javascript观察者模式
    CSS reset
    【CSS3】background-origin和background-clip的区别
    :before和::before的区别
    JS实现瀑布流
  • 原文地址:https://www.cnblogs.com/bonelee/p/10188204.html
Copyright © 2020-2023  润新知