算法(三)找出数组中第K大元素
2017-09-18 15:35
363 查看
题目描述:
解法如下:
1. 用选择排序,冒泡法这类的排序,对前K个元素进行排序。这三种算法也许不是最快的排序算法。但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N)。这个过程不能中断,要计算第三大的元素必须建立在已经算出第二大的元素的基础上(因为每次都是计算当前数组最大)。所以它的算法复杂度是O(N*K);
2. 使用类似快排的方法,选择一个元素,使得左边元素都比他小,右边元素都比他大。记录此时元素位置,若小于k,则在右边重新快排,否则在左边重新快排。时间复杂度为O(N)。代码如下:
Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element. For example, Given [3,2,1,5,6,4] and k = 2, return 5.
解法如下:
1. 用选择排序,冒泡法这类的排序,对前K个元素进行排序。这三种算法也许不是最快的排序算法。但是都有个性质:计算出最大(小)的元素的算法复杂度是O(N)。这个过程不能中断,要计算第三大的元素必须建立在已经算出第二大的元素的基础上(因为每次都是计算当前数组最大)。所以它的算法复杂度是O(N*K);
2. 使用类似快排的方法,选择一个元素,使得左边元素都比他小,右边元素都比他大。记录此时元素位置,若小于k,则在右边重新快排,否则在左边重新快排。时间复杂度为O(N)。代码如下:
class Solution { public: int findKthLargest(vector<int> & nums, int k) { int aim = nums.size() - k; int position = quickSort(nums,0, nums.size() - 1); int start = 0; int end = nums.size() - 1; while (position != aim) { if (position < aim) { start = position + 1; } else { end = position - 1; } position = quickSort(nums, start, end); } return nums[position]; } int quickSort(vector<int> & nums,int start, int end) { int flag = rand() % (end - start + 1) + start; int temp = nums[flag]; nums[flag] = nums[start]; nums[start] = temp; int last_small = start; for (int i = start + 1; i <= end; ++i) { if (nums[i] < nums[start]) { last_small++; temp = nums[last_small]; nums[last_small] = nums[i]; nums[i] = temp; } } temp = nums[last_small]; nums[last_small] = nums[start]; nums[start] = temp; return last_small; } };
相关文章推荐
- 从一个数组中找出第k小元素的随机化算法 c语言实现 算法导论第九章
- 算法题:找出一个数组中依次最大的k个元素
- n个元素的数组中找出前K个最大数最有效算法O(nlg(k))
- 【趣味算法题】在数组中,对于所有元素,找出比当前元素大的下一个元素
- 整数数组中,每个元素均出现两次,除了一个元素例外,如何找出这个元素?能否设计一个线性时间的算法,且不需要额外的存储空间?
- 算法题:找出一个数组中相加值最大的连续序列元素
- 数组中找出第二个最大的元素(第k大的元素)
- JAVA代码—算法基础:找出整形数组中只出现过1次的两个元素
- C语言找出数组中的特定元素的算法解析
- 算法 n大小的数组中找出出现3/n次数以上的元素
- 利用快排思想找出数组中第k大的元素
- 面试算法:lg(k)时间查找两个排序数组合并后第k小的元素
- [LeetCode] Kth Largest Element in an Array (找出数组的第k大的元素)
- 基础算法----找出集合中最大和值的子数组,插入排序,找出数组中出现最多的元素
- 找出大数组array中第k大的元素(要求时间复杂度O(1))
- java 实现从无序数组中 找出第k大的数, 无序数组充许有重复元素
- 在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。
- 【每天学点算法题10.18】找出数组中的第K大的数
- 算法之每日一题:找出无序数组中第k大的数字
- 算法之找出数组中出现次数大于n/m的元素