215. Kth Largest Element in an Array

题意,求数组中的第K大的数。

思路1:利用快速排序的思路,找到一个下标为n-K的下标index,前面从下标0至n-K-1的数均小于index,该下标的值即为第K大的数字

思路2:利用堆或者红黑树来解答。维护一个容量为K的容器,建立一个小根堆,遍历数组一遍,如果遍历的元素的值比堆顶元素值要大,则移除堆顶的元素,插入遍历的元素。最后得到的堆顶元素即为所求的第K大的元素。 由于multiset是基于红黑树实现的,故可以直接拿来使用


思路1的代码:

class Solution {
public:
    int partition(vector<int>& nums,int l,int r)
    {
          int i=l,j=r;
          int tmp =nums[i];
          while(i<j)
          {
              while(i<j&&nums[j]>=tmp)
              	 j--;
              if(i<j)
                 nums[i++]=nums[j];
              while(i<j&&nums[i]<tmp)
              	 i++;
              if(i<j)
              	 nums[j--]=nums[i];
          }
          nums[i]=tmp;
          return i;
    }

    int findKthLargest(vector<int>& nums, int k) 
    {
         int size = nums.size();
         int l =0,r=size-1;
         int index=partition(nums,0,size-1);
         while(index!=size-k){
            if(index>size-k){
            	index = partition(nums,l,index-1);
            }
            else{
            	index = partition(nums,index+1,r);
            }

         }
         return nums[index];
    }
};



思路2的代码:

//此处为学习函数对象的使用,实际上multiset 默认是升序排列的。
template<class T>
class less_{
public:
    bool operator()(const T& x,const T& y)const{
        return x<y;
    }
    
};
class Solution {
public:
    multiset<int,less_<int>> mset;  //可以写作  multiset<int> mset;
    typedef multiset<int>::iterator iter;

    int findKthLargest(vector<int>& nums, int k) {
          if(k<1||nums.size()<k)
          	return 0;
          int size=nums.size();
          vector<int>::iterator it = nums.begin();
          for(;it!=nums.end();++it)
          {  
          	 if(mset.size()<k)
               mset.insert(*it);
             else{
             	iter it_mset = mset.begin();
                if(*it>*it_mset){
                      mset.erase(it_mset);
                      mset.insert(*it);

                }
             }
          }
          return *(mset.begin());
        
    }
};



                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值