leetcode

215. 数组中的第K个最大元素

2020-03-19  本文已影响0人  geaus

题目描述

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素。
示例:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

解题思路

方法1:使用快排,每次返回当前正确归位元素的下标,直至下标与'k'一致。

    int partition(vector<int>& nums, int start, int end){
        int small = start - 1;
        for(int idx=start; idx<end; idx++){
            if(nums[idx]<nums[end]){
                small++;
                swap(nums[small], nums[idx]);
            }
        }
        small++;
        swap(nums[small], nums[end]);
        return small;
    }
    int findKthLargest(vector<int>& nums, int k) {
        k = nums.size() - k;
        int start = 0, end = nums.size() - 1;
        int index = partition(nums, start, end);
        
        while(index!=k){
            if(index>k)
                end = index - 1;
            else
                start = index + 1;
            index = partition(nums, start, end);
        }
        return nums[index];
    }

时间复杂度为O(n),空间复杂度O(1)

同样,快排方法也可以用于无序数组查找最大、最小值,相比于遍历整个数组要稍微优化一些。

方法2:维护一个大小为k的小顶堆,不断将数组元素喂进去,直至结束。最后返回堆顶。

    int findKthLargest(vector<int>& nums, int k) {
        //升序的优先队列
        priority_queue <int,vector<int>,greater<int> > ascending;
        for (int &i:nums)
        {
            ascending.push(i);
            if (ascending.size()>k)
                ascending.pop();
        }
        return ascending.top();
    }

时间复杂度为O(nlog(k)),空间复杂度为O(k)。

上一篇下一篇

猜你喜欢

热点阅读