给定一个乱序数组,找到其中第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大的值,要求时间复杂度最低的主要内容,如果未能解决你的问题,请参考以下文章

如何查找无序数组中的Top n

找出数组中每个数右边第一个比它大的元素

找出数组中每个数右边第一个比它大的元素

数组中的第K个最大元素

最快效率求出乱序数组中第k小的数

找出数组中每个数右边第一个比它大的元素--时间复杂度o(n)单调栈解法