#include<iostream>
#include<cstdlib>
using namespace std;
void SwAp(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
int FindKthLargest(int *num,int k,int left,int right){
int base=num[left];//基准数
int L=left,R=right;
while(1){
while((left<=right)&&(base<=num[left])) left++;
while((left<right)&&base>num[right]) right--;
if(left<right){
SwAp(num[left],num[right]);
}else break;
}
SwAp(num[left-1],num[L]);
if((left-L-1)>=k) return FindKthLargest(num,k,L,left-2);
else if((left-L-1)<k-1) return FindKthLargest(num,k-(left-L-1)-1,left,R);
else return base;
}
int main(){
int N,k;
while(cin>>N>>k){
int *num=(int *)malloc(N*sizeof(int));
for(int i=0;i<N;i++){
cin>>num[i];
if(i+1>=k){
int result=FindKthLargest(num,k,0,i);
cout<<result<<endl;
}
}
free(num);
}
return 0;
}
优化递归算法在该题的时间损耗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- _GX_ 2022-02-18 23:56关注
这题用优先队列做更简单
#include <iostream> #include <queue> #include <vector> using namespace std; int main() { int n, k; while (cin >> n >> k) { vector<int> a(n); for (int i = 0; i < n; i++) cin >> a[i]; priority_queue<int, vector<int>, std::greater<int>> queue; for (int i = 0; i < k; i++) queue.push(a[i]); cout << queue.top() << '\n'; for (int i = k; i < n; i++) { queue.push(a[i]); queue.pop(); cout << queue.top() << '\n'; } } return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
- ¥15 模糊pid与pid仿真结果几乎一样
- ¥15 java的GUI的运用
- ¥15 Web.config连不上数据库
- ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
- ¥15 怎么配置广告联盟瀑布流
- ¥15 Rstudio 保存代码闪退
- ¥20 win系统的PYQT程序生成的数据如何放入云服务器阿里云window版?
- ¥50 invest生境质量模块
- ¥15 nhanes加权logistic回归,svyglm函数