One - One Code All

Blog Content

Lintcode-5:在数组中找到第k大的元素

每日一练 算法 C/C++ LintCode   2010-03-05 19:36:05

在数组中找到第k大的元素

你可以交换数组中的元素的位置

样例
给出数组 [9,3,2,4,8],第三大的元素是 4

给出数组 [1,2,3,4,5],第一大的元素是 5,第二大的元素是 4,第三大的元素是 3,以此类推

挑战
要求时间复杂度为O(n),空间复杂度为O(1)


解法:

  1. 选择排序,交换排序,冒泡排序;算法复杂度是O(N*K)。

  2. 快速排序每次把一个元素交换到正确的位置,同时把左边的都放上大的,右边都放上小的。这个算法每一次选取一个枢纽元,排序之后,查看枢纽元的位置。如果它的位置大于K,就说明,要求出前面一个子序列的第K大的元素。反之,如果小于K,就说明要求出在后面一个序列的第K - 前一个序列的长度个元素。算法复杂度是O(N*logN)。

  3. Hash映射。计数排序。

  4. 二叉堆来做。对大小为N的数组构建二叉堆的算法复杂度是O(N)。然后每次下滤的算法复杂度是O(logN),一共下滤K次,算法复杂度是O(N+K*logN)。


上一篇:Lintcode-4:丑数 II
下一篇:约瑟夫环,报数出列

The minute you think of giving up, think of the reason why you held on so long.