日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

O(n)算法得到数组中第k大的数字

發(fā)布時間:2023/12/15 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 O(n)算法得到数组中第k大的数字 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


思路:只要牽扯到排序,那么復雜度就是O(nlogn)的了。這里我們借鑒了快速排序的思想,首先任取一個數字,將小于它的放到左邊,大于它的放到右邊,然后這個數字的位置就可以確定。通過比較k和這個數字的位置,我們就可以判斷應該在這個數字的左邊還是右邊,然后就可以重復上面的操作。最終復雜度是O(n),但是最終數組的位置會改變。
代碼如下:

#include<bits/stdc++.h> #define ll long long using namespace std;const int maxx=1e6+100; int a[maxx]; int n,k;inline int dfs(int l,int r) {if(l<r){int i=l,j=r;int x=a[l];while(i!=j){while(i<j&&a[j]>x) j--;while(i<j&&a[i]<=x) i++;if(i<j) swap(a[i],a[j]);}a[l]=a[i];a[i]=x;return i;} } inline int find(int len,int num) {int l=0;int r=len-1;int res=dfs(l,r);while(res!=num){if(res>num) {r=res-1;res=dfs(l,r);}else {l=res+1;res=dfs(l,r);}}return a[num]; } int main() {scanf("%d%d",&n,&k);for(int i=0;i<n;i++) scanf("%d",&a[i]);printf("%d\n",find(n,n-k));return 0; }

努力加油a啊,(o)/~

總結

以上是生活随笔為你收集整理的O(n)算法得到数组中第k大的数字的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。