Skip to content

Latest commit

 

History

History
76 lines (72 loc) · 1.79 KB

套路.md

File metadata and controls

76 lines (72 loc) · 1.79 KB

注意题目给定数据特性

  • 有序数组

    首先可以想到二分

  • 无重复数组
  • 二叉搜索树

    首先可以想到中序遍历

  • 数组元素几乎出现偶数次 个别奇数次

    首先要想到异或

注意题目要求

  • 求topK

    小根堆,大根堆 数组类排序后直接取 优化版的快速选择算法

  • 求倒数第k个

    链表可以采用快慢指针 数组可以直接取

  • 判断链表是否有环

    可以采用快慢指针 时间换空间 可以采用哈希表 空间换时间

  • 求若干数之和

    有序数组可以采用双指针两端逼近 无序数组先排序

  • 字符匹配

    穷举 贪心回溯

  • 求中位数

    一个大根堆和一个小根堆

  • 求topK个数之和

    可以使用堆 并维护一个和 对堆的任何修改都同步修改这个和

  • 求出现次数只有1次

    哈希表统计次数 若其他数组都出现了偶数次 那么可以采用异或

  • 求缺少的数

    哈希表 异或

  • 括号(或其他类似的)匹配

    采用栈(当只关注栈深度时 可以直接用数字保存)

注意复杂度

  • O(1)

    常数级别的可能有栈,队列

  • O(N)

    O(N)级别的可能有双指针

  • O(logK)

    低于O(logN)的首先想到堆

  • O(logN)

    带对数的首先想到二分

  • O(NlogK)

    可以想到若干次遍历 每次遍历过程中操作一次堆

  • O(NlogN)

    可以想到若干次遍历 每次遍历过程中进行一次二分

注意题目的实现方式

  • 穷举
  • 迭代
  • 递归
  • 递推
  • 动态规划

常规的解题套路

  • 双指针
  • 快慢指针
  • 滑动窗口
  • 穷举
  • 贪心
  • 动态规划
  • 迭代
  • 递归
  • 二分
  • 单调栈
  • 队列
  • 单调队列
  • dfs
  • bfs
  • 最短路径