【leetcode】215. Kth Largest Element in an Array
题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
https://leetcode-cn.com/problems/kth-largest-element-in-an-array/
解法1
时间复杂度:O(nlogn)
思路:使用快速排序,将数组排序,然后找到第k个最大的元素。这里需要复习一下快速一下快速排序的实现方法。
https://blog.csdn.net/A_BlackMoon/article/details/81064712
int partition(vector<int> &vec, int left, int right)
{
int base = vec[left];
while(left < right)
{
while(vec[right] >= base && left < right)
right --;
swap(vec[left], vec[right]);
while(vec[left] <= base && left < right)
left ++;
swap(vec[left], vec[right]);
}
return left;
}
int fast_sort(vector<int> &vec, int left, int right)
{
if (left < right)
{
int point = partition(vec, left, right);
fast_sort(vec, left, point - 1);
fast_sort(vec, point + 1, right);
}
return 0;
}
int findKthLargest(vector<int> &nums, int k)
{
if (k > nums.size())
return 0;
fast_sort(nums, 0, nums.size() - 1);
return nums[nums.size() - k];
}
解法2
时间复杂度:O(nlogn)
思路:直接使用sort库函数进行排序。
int findKthLargest(vector<int> &nums, int k)
{
if (k > nums.size())
return 0;
sort(nums.begin(), nums.end());
return nums[nums.size() - k];
}
解法3
时间复杂度:O(nlogn)
思路:利用快排的思想,所获取的patiton即已经排好序的位置,将其与倒数第k的位置作比较。
若相等,则正好是所求的第k大位置;
若小于,则继续对[patition + 1, high]求patition;
若大于,则继续对[low, patition - 1]求pattion。
int partition(vector<int> &vec, int left, int right)
{
int base = vec[left];
while(left < right)
{
while(vec[right] >= base && left < right)
right --;
swap(vec[left], vec[right]);
while(vec[left] <= base && left < right)
left ++;
swap(vec[left], vec[right]);
}
return left;
}
int findKthLargest(vector<int> &nums, int k)
{
if (k > nums.size())
return 0;
int point = 0;
int low = 0, high = nums.size() - 1;
int dest = nums.size() - k;
while(1)
{
point = partition(nums, low, high);
if (point == dest)
return nums[dest];
else if (point > dest)
high = point - 1;
else
low = point + 1;
}
return 0;
}