zoukankan      html  css  js  c++  java
  • Kth Largest Element in an Array -- LeetCode

    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.

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

    思路:

    1. 使用小顶堆。复杂度O(k + (n - k)logk)

    用所给数组的前k个数构建一个小顶堆,然后用后续的数字依次与堆顶的数字进行比较。若堆顶数字小于该数,则弹出并将该数放入堆。最后堆顶的就是第K大的数字。因为堆是在原数组上构建的,因此空间复杂度为O(1)。

    这里heap操作用的是标准库中提供的函数。在调用pop heap后,堆顶的元素会被放置到堆的最后一个位置上,需要我们手动进行pop。而push则是我们需要把新的元素放到堆的最后,然后执行push heap操作。因此,当我们需要pop堆顶元素并添加新元素时,只需要在pop后将最后一个元素与新元素swap,再执行push函数就行。

    heap的每一个函数操作都需要自己进行定义比较函数。如果不定义,默认是按照大顶堆来的(less函数)。

     1 class Solution {
     2 public:
     3     int findKthLargest(vector<int>& nums, int k) {
     4         make_heap(nums.begin(), nums.begin() + k, greater<int>());
     5         for (int i = k, n = nums.size(); i < n; i++)
     6             if (nums.front() < nums[i])
     7             {
     8                 pop_heap(nums.begin(), nums.begin() + k, greater<int>());
     9                 swap(nums[i], nums[k - 1]);
    10                 push_heap(nums.begin(), nums.begin() + k, greater<int>());
    11             }
    12         return nums.front();
    13     }
    14 };

     

  • 相关阅读:
    转载--如果不想一辈子做工程师!
    转-----FPGA工程师:持守梦想or屈于现实
    TIMEQUEST学习之黑金动力(四)
    fir 窗口设计法
    CORDIC逼近算法
    sram的读和写
    ad采样后幅度的衰减
    verilog 之数字电路 边沿检测电路
    verilog 之数字电路 寄存器,触发器。
    da分布式算法
  • 原文地址:https://www.cnblogs.com/fenshen371/p/5172811.html
Copyright © 2011-2022 走看看