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大的值
class Solution {
public:
void bubblesort(vector<int>&nums) {
for (int i = 0 ; i < nums.size() - 1 ; i++) {
if (nums[i] > nums[i+1]) {
int temp = nums[i];
nums[i] = nums[i+1];
nums[i+1] = temp;
}
}
}
int findKthLargest(vector<int>& nums, int k) {
for (int i = 0 ; i < k ; i++) {
bubblesort(nums);
}
int size = nums.size();
return nums[size - k];
}
};
解法二:分治法
class Solution {
public:
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int partition(vector<int> arr, int left, int right, int pivotIndex)
{
int storeIndex = left;
int pivotValue = arr[pivotIndex];
int i;
swap(&arr[pivotIndex],&arr[right]);
for (i = left; i < right; i ++)
{
if (arr[i] > pivotValue)
{
swap(&arr[i],&arr[storeIndex]);
storeIndex++;
}
}
swap(&arr[storeIndex],&arr[right]);
return storeIndex;
}
int findKMax(vector<int>& arr, int left, int right, int k)
{
int nRet;
int pivotIndex = left + 1;
nRet = partition(arr,left,right,pivotIndex);
if (nRet < k)
{
return findKMax(arr,nRet+1,right,k);
}
else if (nRet > k)
{
return findKMax(arr,left,nRet-1,k);
}
return nRet;
}
int findKthLargest(vector<int>& nums, int k) {
return nums[findKMax(nums,0,nums.size()-1,k-1)];
}
};