算法笔记-数组/字符串

数组问题的时间复杂度优化

overalll

单纯的与数组相关的问题(包括字符串), 题目本身通常不难, 难点在与如何优化时间复杂度。

例如:

  • offer 39-41 :
    • 找到数组中数量大于一半的数字
    • 找到数组中第k小的k个数
    • 找到流数据的中位数

这些问题, 使用单纯的暴力排序均可解答, 但时间复杂度较高。

可以使用的优化方法:

  • Partition:

    • 如果问题问的是 第k个数怎么怎么样, 例如数组中第k大的数,或者最小的k个数, 那么可以使用Partition求解。

      因为通过快排的partition方法, 可以O(n) 的找到第k小的数字, 当然这也包扩小于第k小数字的所有数字。

  • 二分:

    • 如果是找 两个数组中第k小的数字, 那么除了merge两个数组以外, 可以使用二分的思想, 当然使用二分的前提是两个数组均是排序的。
  • 数据结构的利用:

    • priority queue: 最小堆, 最大堆
    • AVL Tree
    • 链表

    offer41以及offer40.