题目描述
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4]
和 k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6]
和 k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度
答案代码
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(k > nums.size())
return 0;
k = nums.size() - k;
quicksort(nums,0,nums.size()-1);
return nums[k];
}
public:
void quicksort(vector<int>& arr,int l, int r){
if(l >= r)
return ;
int mid;
mid = partition(arr ,l ,r);
quicksort(arr,l,mid-1);
quicksort(arr,mid+1,r);
}
public:
//关键的划分函数,保证左边都比key小,右边都比key大
int partition(vector<int>& arr, int l ,int r){
int v = arr[l];//基准设为第一个元素
//arr[l+1...j] < v arr[j+1 ... r] > v
int j = l;
for(int i = l + 1; i <= r; i++){ //此处一定要理解,为什么是从l + 1开始,因为我们要要维护arr[l+1...j] < v这个循环不变量。
if(arr[i] < v){
swap(arr[++j],arr[i]);
}
}
swap(arr[l],arr[j]);
return j;
}
};
测试代码
#include <iostream>
#include <vector>
using namespace std;
//利用快速排序思想
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if(k > nums.size())
return 0;
k = nums.size() - k;
quicksort(nums,0,nums.size()-1);
return nums[k];
}
public:
void quicksort(vector<int>& arr,int l, int r){
if(l >= r)
return ;
int mid;
mid = partition(arr ,l ,r);
quicksort(arr,l,mid-1);
quicksort(arr,mid+1,r);
}
public:
//关键的划分函数,保证左边都比key小,右边都比key大
int partition(vector<int>& arr, int l ,int r){
int v = arr[l];//基准设为第一个元素
//arr[l+1...j] < v arr[j+1 ... r] > v
int j = l;
for(int i = l + 1; i <= r; i++){ //此处一定要理解,为什么是从l + 1开始,因为我们要要维护arr[l+1...j] < v这个循环不变量。
if(arr[i] < v){
swap(arr[++j],arr[i]);
}
}
swap(arr[l],arr[j]);
return j;
}
};
int main() {
int n;
cin>>n;
int arr[n];
for(int i = 0; i < n; i++)
cin>>arr[i];
vector<int> vec(arr,arr+ sizeof(arr)/ sizeof(int));
cout<<Solution().findKthLargest(vec,n-1)<<endl;
return 0;
}
这就是强者的世界吗?
欢迎讨论,一起刷题,一起前往强者的世界。优快云@anchuanxu 折剑山庄