zoukankan      html  css  js  c++  java
  • 215. Kth Largest Element in an Array

    问题描述:

    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.

    Example 1:

    Input: [3,2,1,5,6,4] and k = 2
    Output: 5
    

    Example 2:

    Input: [3,2,3,1,2,4,5,5,6] and k = 4
    Output: 4

    Note:
    You may assume k is always valid, 1 ≤ k ≤ array's length.

    解题思路:

    这道题我一开始觉得最优也是要NlogN的时间复杂度,因为是无序的,我们需要对他进行排序,无论用堆还是什么其他的排序算法,应该都是要nlogn的。

    后来就排序取了返回值,看了一下别人的做法,还是我太naive了。。

    这里可以用快速排序的思想:Divide and Conquer

    对于pivot值,我们找到pivot在数组中应该放置的地方:

      所有下标小于pivot最后位置的值都应该小于pivot,所有下标大于pivot最后位置的值都应该大于pivot。

    这个时候我们可以观察pivot的位置,来确定接下来对那一部分进行细分,直到pivot的最终位置是nums.size()-K;

    代码:

    // quick select
    class Solution {
    public:
        int findKthLargest(vector<int> &nums, int k)
        {
            int n = nums.size();
            if (k <= 0 || n < k)
                return INT_MIN;
            
            return quick_select(nums, 0, n-1, n-k+1);
        }
        
        // quick select the k-th smallest element in the range [l, r]
        int quick_select(vector<int> &nums, int l, int r, int k)
        {
            if (l > r)
                return INT_MIN;
            
            int index = rand() % (r-l+1) + l;
            std::swap(nums[l], nums[index]);
            
            int i = l;
            for (int j = l; j <= r; ++j)
                if (nums[j] < nums[l])
                    std::swap(nums[++i], nums[j]);
            std::swap(nums[l], nums[i]);
            
            if (i-l+1 == k)
                return nums[i];
            else if (i-l+1 > k)
                return quick_select(nums, l, i-1, k);
            else
                return quick_select(nums, i+1, r, k-(i-l+1));
        }
    };
  • 相关阅读:
    Codeforces 900D Unusual Sequences 容斥原理
    Codeforces 900C Remove Extra One 模拟
    Codeforces 897D. Ithea Plays With Chtholly (交互)
    Codeforces 895C
    Monkey测试环境搭建
    SDK/JDK,Shell/Shell脚本,Apache/APR ,MTK
    计算机基础——Java笔记一
    用Fiddler模拟低速网络环境(弱网)
    弱网定义
    Xcode中的几个常用文件路径
  • 原文地址:https://www.cnblogs.com/yaoyudadudu/p/11711285.html
Copyright © 2011-2022 走看看