Kth Largest Element in an Array
题目详情:
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小于右边数组的大小,则在在右边寻找第k大的数。如果k大于右边数组的大小,并且k小于或等于与它相等的数组的大小和右边数组大小之和,则第k大的数就是这个数。如果k大于与它相等的数组的大小和右边数组大小之和,则在左边数组寻找第(k-与它相等的数组的大小-右边数组的大小)大的数。
这是分治算法的经典例子。注意每次可以随机取数组中的数,或者是取数组中间的数,如果取数组第一个数或者是最后一个数,容易出现极端情况。
详细代码:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return select(nums, k);
}
int select(vector<int>& array, int k) {
if (array.size() > 0) {
int com = array[array.size()/2];
vector<int> left;
vector<int> right;
for (vector<int>::iterator iter = array.begin(); iter != array.end(); ++iter) {
if (*iter > com) {
right.push_back(*iter);
iter = array.erase(iter);
--iter;
} else if (*iter < com) {
left.push_back(*iter);
iter = array.erase(iter);
--iter;
}
}
if (k <= right.size()) {
return select(right, k);
} else if (k <= (right.size() + array.size()) && k > right.size()) {
return array[0];
} else if (k > (right.size()+array.size())) {
return select(left, k-right.size()-array.size());
}
} else {
return 0;
}
}
};
public:
int findKthLargest(vector<int>& nums, int k) {
return select(nums, k);
}
int select(vector<int>& array, int k) {
if (array.size() > 0) {
int com = array[array.size()/2];
vector<int> left;
vector<int> right;
for (vector<int>::iterator iter = array.begin(); iter != array.end(); ++iter) {
if (*iter > com) {
right.push_back(*iter);
iter = array.erase(iter);
--iter;
} else if (*iter < com) {
left.push_back(*iter);
iter = array.erase(iter);
--iter;
}
}
if (k <= right.size()) {
return select(right, k);
} else if (k <= (right.size() + array.size()) && k > right.size()) {
return array[0];
} else if (k > (right.size()+array.size())) {
return select(left, k-right.size()-array.size());
}
} else {
return 0;
}
}
};
复杂度分析:
T(n)= T(n/2)+ O(n) 为nlogn
代码中需要注意的问题:
vector中erase一个元素,它的iiterate指向的是下一个元素的iterate,所以删除完之后,要--iter。