给定一个乱序数组,找到其中第K大的值,要求时间复杂度最低
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了给定一个乱序数组,找到其中第K大的值,要求时间复杂度最低相关的知识,希望对你有一定的参考价值。
参考技术A参考:http://blog.csdn.net/qq_14821023/article/details/50793468
时间复杂度最低的应该是快排
int findKthLargest(vector<int>& nums, int k)int high = nums.size();
int low = 0;
while (low < high)
int i = low;
int j = high-1;
int pivot = nums[low];
while (i <= j)
while (i <= j && nums[i] >= pivot)
i++;
while (i <= j && nums[j] < pivot)
j--;
if (i < j)
swap(nums[i++],nums[j--]);
swap(nums[low],nums[j]);
if (j == k-1)
return nums[j];
else if (j < k-1)
low = j+1;
else
high = j;
topK问题
概述
在N个乱序数字中查找第K大的数字,时间复杂度可以减小至O(N).
可能存在的限制条件:
要求时间和空间消耗最小、海亮数据、待排序的数据可能是浮点型等。
方法
方法一
** 对所有元素进行排序,之后取出前K个元素,时间复杂度高,不提倡。 **
思路:使用快排,选择排序,堆排序。
时间复杂度:O(n*logn)+O(K)=O(n*logn)
特点:需要对全部元素进行排序,K=1时,时间复杂度也为O(n*logn)。
方法二
** 只需要对前K个元素排序,剩下N-K个元素不需要排序,时间复杂度高,不提倡。 **
思路:使用选择排序 或 冒泡排序, 进行K此选择,可得到第K大的数。
时间复杂度:O(n*k)
以上是关于给定一个乱序数组,找到其中第K大的值,要求时间复杂度最低的主要内容,如果未能解决你的问题,请参考以下文章