[LeetCode] Kth Largest Element in an Array (找出数组的第k大的元素)

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.


方法一:

一看这题,可能第一个想到的就是使用排序算法,但是如果使用排序算法,再找出nums[nums.size()-k]的元素,那么复杂度将会是O(NlogN),如果在数据比较小的情况下可能是能过,但这题很显然不会让你两行代码(sort,return nums[nums.size()-k])结束该题,所以肯定会超时的


方法二:

使用二分法,可以使复杂度降低到O(N),类似于快排,但我们并不需要进行排序。首先取序列中的首元素p,把该序列中比p小的元素放在左边,比p大的元素放在右边.然后根据更新后p在序列中的位置,可以推出第k大的元素在左边还是右边。若在左边,则进行同样的操作,在右边也进行同样的操作。直到p的位置刚刚好在第k大的位置,此时就可返回p,即为答案。

复杂度分析:

每次操作都要进行n次比较,这里的n的序列长度。假设每次取到的元素恰好在中间位置,则每次序列长度减半。所以总共最多需要比较n+n/2+n/4+.....1=n(1+1/2+1/4+....(1/2)^k)≤2n,所以复杂度为O(N)

class Solution {
public:
    
int findKthLargest(vector
   
   
    
    & nums, int k) {
    int begin=0,end=nums.size()-1;
    while(begin<=end)
    {
        int pivot=nums[begin],pt=begin,p1=begin;
        for(int i=begin+1;i<=end;++i)
            if(nums[i]
    
    
   
   


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值