No215. Kth Largest Element in an Array

来源:互联网 发布:知乎 暴戾 编辑:程序博客网 时间:2024/06/03 06:11

一、题目描述

Find the kth largest element in anunsorted 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.

二、方法一

写法最简单的方法,调用sort函数从小到大排序,再输出数组的第n-k位,该方法的时间复杂度是O(nlogn)。

class Solution {public:    int findKthLargest(vector<int>& nums, int k) {        sort(nums.begin(),nums.end());        return nums[nums.size()-k];    }};

三、方法二

对排序进行优化,分别用快排和堆排实现:

快排:

class Solution {public:    int patition(vector<int>& nums,int left,int right){        int l=left+1,r=right;        while(l<=r){            if(nums[l]<nums[left]&&nums[r]>nums[left]){                swap(nums[l],nums[r]);                l++;                r--;            }            if(nums[l]>=nums[left]) l++;            if(nums[r]<=nums[left]) r--;        }        swap(nums[r],nums[left]);        return r;    }    int findKthLargest(vector<int>& nums, int k) {        int left=0,right=nums.size()-1;        while(true){            int pos = patition(nums,left,right);            if(pos==k-1) return nums[pos];            else if(pos>k-1) right=pos-1;            else left=pos+1;        }    }};

堆排:

class Solution {public:    void maxheap(vector<int>& nums,int index){        int large =index;        int left = index*2+1,right=index*2+2;        if(left<heapsize&&nums[large]<nums[left]) large=left;        if(right<heapsize&&nums[large]<nums[right]) large=right;        if(large!=index){           swap(nums[index],nums[large]);           maxheap(nums,large);        }     }    void buildheap(vector<int>& nums){        heapsize=nums.size();        for(int i=(heapsize/2-1);i>=0;i--)            maxheap(nums,i);    }    int findKthLargest(vector<int>& nums, int k) {        buildheap(nums);        heapsize=nums.size();        for(int i=0;i<k;i++){            swap(nums[0],nums[heapsize-1]);            heapsize--;            maxheap(nums,0);        }        return nums[heapsize];    }private:    int heapsize;    };