LeetCode: Kth Largest Element in Array

来源:互联网 发布:淘宝钻石等级可以买吗 编辑:程序博客网 时间:2024/06/05 11:16

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.

解题分析:

首先我们可以很简单的想到一种解决方法,即先排序,然后再根据索引获取到第k大的值

代码如下:

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

但是这种方法的时间复杂度至少为O(nlogn),并不是最好的方法,这里简单讲一下另外一种效率更高的算法。我们使用快排分治的思想,对数据进行Partition操作,如果返回的索引刚好是k-1,则找到,否则,分而治之。这种方法的时间复杂度为O(n)。

代码如下:

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


阅读全文
0 0
原创粉丝点击