题目描述
从输入的N(1<=N<=1000)个不相等的正整数中查找出第K大的数。
输入格式
输入一共包含3行。
第1行,1个正整数N。
第2行,1个正整数K。
第3行,N个正整数。
输出格式
输出共有1行,1个正整数,第K大的数。
输入输出样例
输入 #1复制
10 5 9 8 7 6 5 4 3 2 1 0
输出 #1复制
5
说明/提示
【解题方法1】 先对所有元素进行K-1轮遍历,每轮遍历找出最大的数并将其删除;然后进行第K轮遍历时,取出最大的数即为所求。该方法的时间复杂度为O(nk)。
【解题方法2】 先对所有元素进行降序(从大到小)排序,然后取出第K个的数即为所求。该方法的时间复杂度取决于所使用的排序算法的时间复杂度。
除上述的解题方法外,读者还可以从排序算法中找到时间复杂度更优的解题思路。
#include<iostream>
#include<math.h>
#include<string.h>
#include<stdio.h>
using namespace std;
int arr[1000000];
int devide(int begin,int end)
{
int key=arr[begin];
int low=begin;
int high=end;
while(low<high)
{
while(low<high && arr[high]>=key)
high--;
arr[low]=arr[high];
while(low<high && arr[low]<=key)
low++;
arr[high]=arr[low];
}
arr[low]=key;
return low;
}
int Find(int begin,int end,int k)
{
int index=devide(begin,end);
if(index==end-k+1)
return index;
else if(index<end-k+1)
return Find(index+1,end,k);
else if(index>end-k+1)
return Find(begin,index-1,index-(end-k+1));
// return Find(begin,index,k-1);
}
int main()
{
int n,k;
cin>>n>>k;
memset(arr,0,sizeof(arr));
for(int i=0;i<n;i++)
cin>>arr[i];
int index=Find(0,n,k);
cout<<arr[index]<<endl;
}
文章介绍了在给定一组不相等的正整数中,利用两种方法(一种是K-1轮遍历+删除最大值,另一种是排序后直接获取)找出第K大的数,同时讨论了不同方法的时间复杂度。给出了一段C++代码实现Find函数。
个不相等的正整数中查找出第K大的数。&spm=1001.2101.3001.5002&articleId=134612999&d=1&t=3&u=683dbf163ce94ae59d561c01e461b108)
2005

被折叠的 条评论
为什么被折叠?



