无序数组中第k小的数

快排划分找第k大的数的partition函数改成小的往前抛,二分搜索函数相同。

int findKthSmallest(vector<int>& nums, int k) {
    int l = 0, u = (int)nums.size() - 1;
    k--; // k是1-based,变成下标作比较
    while (l <= u) {
        int p = partition(nums, l, u);
        if (k == p) break;
        if (k < p) u = p - 1;
        else l = p + 1;
    }
    return nums[k];
}

多个有序数组中第k小的数

设x是第k小的数,二分搜索条件enough(x)表示"<=x的个数"count>=k。当猜的x不断变大时,二分搜索输出[0 0 ... 0 1 1 ...]。

若是找第k大的数:设x是第k大的数,二分搜索条件enough(x)表示">=x的个数"count<=k。

两个有序数组中找第k小的数

上题的特例。或者另种方式的二分搜索,见中位数

用k元堆找第k小的数

无序数组中找第k小用最大堆。数据流不断插入并弹出,保持k元堆,弹出N-k次。

作为对比,多个有序数组中找第k小用最小堆,只插入各行最小的数,弹出k-1次。

动态有序集中第k小的节点

扩展红黑树(bst),节点要记录以当前节点为根的子树大小,这就相当于做好了数组中的划分操作。