1.数组中的第k个最大元素
在未排序的数组中找到第 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 ≤ 数组的长度。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/kth-largest-element-in-an-array
思路:基于快排的查找算法
class Solution { public: int findKthLargest(vector<int>& nums, int k) { int len=nums.size(); int start=0,end=len-1; int index=Partition(nums,len,start,end); int cur=len-k; while(index!=cur) { if(index>cur) { end=index-1; index=Partition(nums,len,start,end); } else { start=index+1; index=Partition(nums,len,start,end); } } return nums[index]; } int Partition(vector<int> &numbers,int length,int start,int end)//快排核心函数 { if(length<=0||start<0||end>=length) return false; int index=RandomInRange(start,end); Swap(&numbers[index],&numbers[end]);//随机生成一个点,与尾结点互换 int small=start-1; for(index=start;index<end;index++) { if(numbers[index]<numbers[end]) { ++small; if(small!=index) Swap(&numbers[index],&numbers[small]);//说明small与index之间有大于end下标的数字 } } ++small; Swap(&numbers[small],&numbers[end]); return small; } int RandomInRange(int start,int end) { srand (time(NULL)); return rand() % (end-start+1) + start;//随机数函数 } void Swap(int *a,int *b) { int temp=*a; *a=*b; *b=temp; } };