1. 程式人生 > 資訊 >遊族網路收關注函:要求核實“新浪擬收購公司部分股份”是否屬實

遊族網路收關注函:要求核實“新浪擬收購公司部分股份”是否屬實

兩個有序序列的中位數(分治)

時間複雜度為log(n),首先基本思想因為兩個陣列已經排好,而且求中位數,所以比較兩個陣列的中間元素,要是相等,則因為都是中位數,這兩個數一定挨在一起,則整體的中位數必定是這個數,所以直接返回這個數。具體看下圖

所以基本思路就是這樣。為了保證遞迴的時候兩個子陣列長度相等,對mid可以這樣處理

mid1=(la+ua)/2;
mid2=(lb+ub+1)/2;

這樣的意思是若出現一個偶陣列一個奇陣列,得到的中間位置一樣。

因為保證兩陣列長度一樣,會出現陣列只有兩個的情況,如果按上面的方法會出現

造成死迴圈。所以進行處理

mid1=(la+ua)/2;
mid2=(lb+ub)/2;

這樣處理的都是0位置元素

遞迴終止條件

當兩個陣列都只有一個元素的時候,中位數肯定就是小的那一個。

經過上述兩個元素陣列的處理,會出現一種型別的情況,a陣列有1個元素,b陣列有2個元素,意味著a的元素大於b的第一個元素,按中位數的定義,比較b的第二個元素和a,小的那個就是中位數。同理a,b調換。

完整程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int binary(int la,int ua,int lb,int ub){
	int mid1=(la+ua)/2,mid2=(lb+ub+1)/2;
	if(la==ua&&lb!=ub){
		if(a[la]>b[ub]){
			return b[ub];
		}
		return a[la];
	}
	if(la!=ua&&lb==ub){
		if(a[ua]<b[ub]){
			return a[ua];
		}
		return b[ub];
	}	
	if(la==ua&&lb==ub){
		if(a[la]>b[lb]){
			return b[lb];
		}
		return a[la];
	}
	else{
		if(la+1==ua&&lb+1==ub){
			mid1=(la+ua)/2;
			mid2=(lb+ub)/2;
		} 
		if(a[mid1]==b[mid2]){
			return a[mid1];
		}
		if(a[mid1]<b[mid2]){
			return binary(mid1,ua,lb,mid2);
		}
		if(a[mid1]>b[mid2]){
			return binary(la,mid1,mid2,ub);
		}
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		cin>>b[i];
	}
	cout<<binary(0,n-1,0,n-1);
}