答案 0 :(得分:2)
假设你输了一个数字x
。
让L
为数组中小于x
的数字集合,集合的大小为|L|
让E
成为数组中等于x
的数字集合,集合的大小为|E|
让G
为数组中大于x
的数字集合,集合的大小为|G|
让我们想象一下排序的数组,第一个|L|
数字(1 -> |L|)
包含在集L
中。
以下|E|
个数字(|L|+1 -> |L|+|E|)
包含在E
集中。
以下|G|
个数字(|L|+|E|+1 -> end)
包含在G
集中。
我们正在寻找kth
最小的数字,所以我们有3个案例:
1)k <= |L|
这意味着我们要查找的数字位于排序数组中的前|L|
个数字中,因此我们在{{1}中搜索kth
个最小数字}}
2)L
这意味着我们要查找的数字位于排序数组中|L| < k <= |L|+|E|
之间的位置,因此它是来自(|L|+1 -> |L|+|E|)
的元素。由于E
的所有元素都等于E
,因此我们知道x
最小数等于kth
。
3)x
这意味着我们要查找的数字位于排序数组中k > |L|+|E|
之间的位置,因此它是来自'G'的元素。由于已有(|L|+|E|+1 -> end)
个数字小于|L|+|E|
最小数字,我们可以从kth
中减去|L|+|E|
,我们称之为k
(k'
),并在k' = k - |L| - |E|
中搜索k'th
最小元素。