两个有序数组的第n大数
发布时间:2020-12-14 03:03:18 所属栏目:大数据 来源:网络整理
导读:两个有序数组,各自含有n个元素,求第n大的元素 1.顺序遍历两个数组,计数变量k统计出现的第k小元素,时间复杂度为O(n) 代码如下: int getmid(int a[],int b[],int n){int k=0;int i=0,j=0;while(injn){if(a[i]b[j]){i++;k++;if(k==n)return a[i-1];}else {
两个有序数组,各自含有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 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |