Changchun Master Li

leetcode 215 Kth Largest Element in an Array
数组中找出第 K 大的数

2017-06-03

这是算法导论第九章 randomized-select 的经典问题, 解决方法有很多种

  1. 全部排序
    时间复杂度 O(NlogN)
    空间复杂度 O(1)

  2. 最小优先队列存储前 K 大的数
    时间复杂度 O(NlogK)
    空间复杂度 O(K)

  3. 选择算法
    时间复杂度 O(N) 最好 / O(N^2) 最坏
    空间复杂度 O(1)

  4. 随机选择算法
    时间复杂度 O(N)
    空间复杂度 O(1)

C 代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
int paratition(int *A, int p, int r) {
int x = A[r];
int i = p - 1;

int tmp;
for(int j = p; j < r; ++ j) {
if(A[j] >= x) {
++ i;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
}
}
++ i;
tmp = A[i];
A[i] = A[r];
A[r] = tmp;
return i;
}

int random_paratition(int *A, int p, int r) {
int i = rand() %(r - p + 1) + p;
int tmp;

tmp = A[i];
A[i] = A[r];
A[r] = tmp;
return paratition(A, p, r);
}

int helper(int* A, int p, int r, int i) {
if(r == p) return A[p];
int q = random_paratition(A, p, r);
int k = q - p + 1;

if(i == k)
return A[q];
if(i < k)
return helper(A, p, q - 1, i);
else
return helper(A, q + 1, r, i - k);
}

int findKthLargest(int* nums, int numsSize, int k) {
srand(1311);
return helper(nums, 0, numsSize - 1, k);
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章