题目描述
给定无序整数序列,求其中第K大的数,例如{45,67,33,21},第2大数为45
输入描述:
输入第一行为整数序列,数字用空格分隔,如:45 67 33 21 输入第二行一个整数K,K在数组长度范围内,如:2
输出描述:
输出第K大的数,本例为第2大数:45
示例1
输入
45 67 33 21 2
输出
45
这一道题目排序的时间复杂度是NlogN, 维护一个k个元素的最小堆,时间复杂度是NlogK, 空间复杂度是O(k) ,最优解法是快排的过程,时间复杂度为O(N)
另外注意,这道题目的输入输出比较繁琐,用C++的sstream
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
const int N = 1000000;
// 这个函数的作用是将array前k大的元素都弄到右边
void arrangeRight(int arr[], int k, int start, int end)
{
int key = arr[start];
int left = start, right = end;
while (left != right) {
while (left <right && arr[right] >= key) right--;
swap(arr[left], arr[right]);
while (left < right && arr[left] <= key) left++;
swap(arr[left], arr[right]);
}
if (end - left + 1 == k) // 右边恰好是有k个元素
return;
else if (end - left + 1 > k) // 如果右边多余k个元素
arrangeRight(arr, k, left + 1, end);
else //
arrangeRight(arr, k-end+left-1, start, left-1);
}
int main()
{
int array[N];
string str;
getline(cin,str);
int k,temp,i=0;
cin>>k;
istringstream strm(str);
while(strm>>temp){
array[i++]=temp;
}
int n = i-1;
arrangeRight(array, k, 0,n);
cout<<array[n-k+1]<<endl; // 当k的1,输出的是最后一个, 所以n-k+1
}
版权声明:本文为wwxy1995原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。