题4、2つのソート配列の中央値

题4、2つのソート配列の中央値

タイトル

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;
        
    }

}
公開された25元の記事 ウォンの賞賛0 ビュー130

おすすめ

転載: blog.csdn.net/weixin_45980031/article/details/103465902