Discription
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.
思路
快排思想的应用。
对于无序数组
{a1,a2,⋯,an}
随机选取其中一个数
ai
,按照
>ai
和
<=ai
<script type="math/tex" id="MathJax-Element-969"><= a_i</script>将数组划分成两部分:
{aj1,aj2,⋯,ajnj}>ai>={ak1,ak2,⋯,aknk}
如果
ai
恰好为第k个元素,则
ai
为所求解。否则进一步划分。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码
class Solution {
public:
int partition(vector<int> &nums, int start, int end)
{
int index = rand() % (end - start + 1) + start; //随机选择一个元素
swap(nums[index], nums[end]);
int big = start; //下一个 >= nums[end] 的元素所应放置位置
for (int i = start; i <= end; i++)
{
if (nums[i] > nums[end]) // 注意: >= 无法通过 {1}, k = 1 样例,越界错误
{
if (i != big)
swap(nums[i], nums[big]);
big++;
}
}
swap(nums[end], nums[big]);
return big;
}
int findKthLargest(vector<int>& nums, int k) {
int left = 0, right = nums.size() - 1;
while (true)
{
int loc = partition(nums, left, right);
if (loc == k - 1)
return nums[loc];
if (loc < k - 1)
left = loc + 1;
else
right = loc - 1;
}
}
};
特殊样例
{1}, 1
扩展
该方法时间复杂度为什么是 O(n) ?