タイトル
2つのソート配列nums1とサイズmのnums2及びnは、それぞれがあります。
2つのソート配列の中央値を検索します。全体的な実行時間の複雑さはO(ログ(M + N))であるべきです。
あなたはnums1をとることができるとnums2は両方とも空にすることはできません。
例1:
nums1 = [1,3]
nums2 = [2]
中央値は2.0である
実施例2:
nums1 = [1、2]
nums2 = [3、4]
中央値は、(2 + 3)/ 2 = 2.5であります
思考
この質問は、アレイの2つの行がソートされている与えられ、その後、合併後の2つの配列の中央値を求めるれます。
問題解決のためのアイデアもう少し前進してくる対応する値、と大きなコントラストに小さく、現在の値を比較(オーバー値とは対照的に、彼が最も大きい)とmedian1 median2に格納されていますここでコントラストがあまりにmedian1最大値であり、median2は二番目に大きいです。
二つの異なるパリティ値を格納するためによれば、中央値の結果が同じではない、その理由は、理由である(長さは、中央値1奇数である;平均両者の中央値と、偶数長さ)、Iは、サイクル数を設定します配列の長さが奇数である場合、中央値は正確median1である(長さ+ 1)/2.0は、偶数であり、2つの値が正確median1とmedian2の平均です。
点があることに注意してください、入力アレイは、ブランク空である、または異なる長さ、および可能なクロスボーダーの多様。
とにかく、厄介な詳細のすべての種類は、ピットの外に気づきました。
コード
public class T004 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] nums1 = { };
int[] nums2 = { };
System.out.println( findMedianSortedArrays(nums1, nums2) );
}
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
//两个数组的长度之和
int length = nums1.length + nums2.length;
//两个整型数,用于存贮中位数(长度为偶数的话中位数是两个的均值)
int median1 = Integer.MIN_VALUE;
int median2 = 0;
//长度为零直接返回结果0
if( length == 0 )
return 0;
//长度为1直接返回结果
else if( length == 1 )
return nums1.length==0 ? nums2[0]:nums1[0];
//判断给出的两个数组是否存在空的,存在的话直接得到中位数并返回结果
if( nums1.length == 0 && length > 1 ) {
median1 = nums2[(length-1)/2];
median2 = nums2[(length+1)/2];
return (length+1)%2 == 0 ? median1 : (median1+median2)/2.0;
}else if( nums2.length == 0 && length > 1 ) {
median1 = nums1[(length-1)/2];
median2 = nums1[(length+1)/2];
return (length+1)%2 == 0 ? median1 : (median1+median2)/2.0;
}
for( int count = 0, i = 0, j = 0; count < (length+1)/2.0; count++ ) {
//如果ij两个游标均未超出数组的长度
if( i<nums1.length && j<nums2.length ) {
//判断当前的两个值的大小,并将小的存储在median1中,将median1之前的值的存储在median2中
if( nums1[i] < nums2[j] ) {
median2= median1;
median1 = nums1[i];
i++;
}else{
median2= median1;
median1 = nums2[j];
j++;
}
//若游标I超出
}else if( i>=nums1.length && j<nums2.length ) {
//i对应数组nums1,若其超出就对比nums1最后一位(最大的一个)和nums2当前的,
//若大将其赋值给median1,小就对j进行加一并将nums2当前值赋给median1
if( nums1[nums1.length-1] > nums2[j] ) {
median2= median1;
median1 = nums1[nums1.length-1];
i++;
}else {
median2= median1;
median1 = nums2[j];
j++;
}
//若J超出
}else if( i<nums1.length && j>=nums2.length ) {
//同上
if( nums1[i] < nums2[nums2.length-1] ) {
median2= median1;
median1 = nums2[nums2.length-1];
j++;
}else {
median2= median1;
median1 = nums1[i];
i++;
}
}
}
//根据奇偶返回相对应的结果
return (length+1)%2 == 0 ? median1 : (median1+median2)/2.0;
}
}