DC-leetcode215数组中的第k大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

示例 1:

输入: [3,2,1,5,6,4] 和 k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

说明:

你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。

分析:这种问题老师讲了很多解法,一步比一步的效率要好,这里我用了基于划分的方法,类似于快排。

class Solution {
public:
    //根据第一个元素划分位置
    int partition(vector<int>&nums,int low,int high){
        int temp=nums[low];
        int p=nums[low];
        while(low<high){
                      
                 while(low<high&&nums[high]<=temp)high--;
                 nums[low]=nums[high];
                
                 while(low<high&&nums[low]>=temp)low++;
                 nums[high]=nums[low];
                 
            }
            nums[low]=temp;
            return low;
        
           
               
        
    }
    int findKthLargest(vector<int>& nums, int k) {
      int begin=0,end=nums.size()-1;
      //如果把数据从大到小排序的话,第k大元素就是第k-1位置的元素。
      //当k-1<position的话,就去划分位置的左边去找;如果k-1>position的话去划分位置的右边去找;相等的话直接返回。
             while(1){
            int position=partition(nums,begin,end);
            if(k-1==position)return nums[position];
            else if(k-1<position) end=position-1;
            else begin=position+1;
        }
    }
};

 

posted @ 2018-12-25 10:03  阳光zfc  阅读(118)  评论(0)    收藏  举报