215. Kth Largest Element in an Array(第k大的数)

**题目:**在未排序的数组中找到第k个最大元素。请注意,它是排序顺序中第k个最大的元素,而不是第k个不同的元素。

思路:这个题目的思路不不止一个:
思路1(最快的):采用stl的 nth_element()函数来进行选出第k大的数字。实现细节:参数一共有四个 nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), greater()); 然后就返回nums[k-1]。
**实现细节:**不断用 median-of-3-partitioning (三点中值为中枢分割)将整个序列分割为更小的左右序列。如果nth 迭代器落到左边,左边再分割,直到分割后的子序列长度不大于3.然后插入排序。

思路2,利用堆的特性,priority_queue 容器来弹出k-1个数。
思路3:快速排序,设置哨兵,然后从两边往中间走,直到哨兵处于第k个,获得,注意一开始的 l 与 r要可以相等,否则到了最后的l==r时,会直接跳过

代码1:nth_element()

  1. int findKthLargest(vector<int>& nums, int k) {
  2. nth_element(nums.begin(), nums.begin() + k - 1, nums.end(), greater<int>());
  3. return nums[k - 1];
  4. }

代码2:priority_queue

  1. int findKthLargest(vector<int>& nums, int k){
  2. priority_queue<int> heap(nums.begin(), nums.end());
  3. for(int i=0;i<k-1;++i)
  4. heap.pop();
  5. return heap.top();
  6. }

代码3: 快速排序

  1. class Solution {
  2. int findKthLargest(vector<int>& nums, int k){
  3. if(k>nums.size())
  4. return -1;
  5. findres(nums, k,0, nums.size()-1);
  6. return res;
  7. }
  8. void findres(vector<int>& nums, int k ,int l,int r){
  9. if(l<=r){
  10. int low=l,high=r;
  11. int sentry=nums[l];
  12. while(low<high){
  13. while(low<high && nums[high]<sentry)
  14. high--;
  15. if(low<high)
  16. nums[low++]=nums[high]; //第一个小于sentry的
  17. while(low<high && nums[low]>sentry)
  18. low++;
  19. if(low<high)
  20. nums[high--]=nums[low];
  21. }
  22. //找到对应的位置了,但是low还没有赋值
  23. nums[low]=sentry;
  24. if(low+1==k)
  25. { res=nums[low];
  26. return ;}
  27. else if(low+1 >k)
  28. findres(nums, k,l,low-1);
  29. else
  30. findres(nums,k,low+1,r);
  31. }
  32. return ;
  33. }
  34. private:
  35. int res;
  36. };

发表评论

表情:
评论列表 (有 0 条评论,57人围观)

还没有评论,来说两句吧...

相关阅读