兩個有序數組的第n大數

來源:互聯網
上載者:User

標籤:有序數組   中位元   

兩個有序數組,各自含有n個元素,求第n大的元素

1.順序遍曆兩個數組,計數變數k統計出現的第k小元素,時間複雜度為O(n)

代碼如下:

int getmid(int a[],int b[],int n){int k=0;int i=0,j=0;while(i<n&&j<n){if(a[i]<b[j]){i++;k++;if(k==n)return a[i-1];}else {j++;k++;if(k==n)return b[j-1];}}}

2.二分的方法

    取A數組的中間元素mid1,取B數組的中間元素mid2,先比較這兩個元素的大小,如果這兩個元素相等,則直接返回A[mid1],如果A[mid1]<B[mid2],則mid1左側的元素可以去掉,B數組右側的元素可以去掉,這裡還要區分數組元素個數為偶數奇數的情況,如果元素個數為偶數,則mid1元素也要去掉。如果A[mid1]<B[mid2]的情況與此類似。時間複雜度為O(logn)

# include <iostream># include <cstdlib>using namespace std;int mid(int a[],int b[],int n){int s1=0,e1=n-1;int s2=0,e2=n-1;int mid1=(s1+e1)/2;int mid2=(s2+e2)/2;while(s1!=e1||s2!=e2){mid1=(s1+e1)/2;mid2=(s2+e2)/2;if(a[mid1]==b[mid2]){return a[mid1];}if(a[mid1]<b[mid2]){if((s1+e1)%2==0){s1=mid1;e2=mid2;}else {s1=mid1+1;e2=mid2;}}else{if((s1+e1)%2==0){e1=mid1;s2=mid2;}else{e1=mid1;s2=mid2+1;}}}return a[s1]<b[s2]?a[s1]:b[s2];}int main(){int a[5]={2,4,5,6,9};int b[5]={1,3,7,8,10};cout<<mid(a,b,5)<<endl;system("pause");return 0;}

兩個有序數組的第n大數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.