1. 程式人生 > >Median of Two Sorted Arrays(兩個有序陣列的中位數)

Median of Two Sorted Arrays(兩個有序陣列的中位數)

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n))

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

求兩個有序陣列的中位數:

主要使用的辦法是,合併排序中所使用的。在合併排序中,首先將序列分成兩部分,將兩部分各自排序,再將已排序的兩部分合並。

具體方法是:先取序列1和序列2中最小的元素,若為順序的話,則為序列1和序列2的首元素,比較兩個元素的大小,若A1[0] > A2[0],則A2[0]為最小的元素,

再比較A1[0] 和A2[1],較小的元素為第二小的元素,反之,A1[0]為最小元素,再比較A1[1] 和 A2[0],較小的為第二小的元素。

依次類推,遍歷兩個陣列的所有元素。

所需的時間複雜度為O(log (m+n)),其中m和n為兩個陣列的各自大小。

基於上述原理,判斷m+n是偶數還是奇數,若為偶數,

則中位數為第(m+n)/2 和 (m+n)/2 + 1大的元素的平均值

若為奇數,則中位數為(m+n)/2 + 1大的元素的值。

程式碼如下(不知道怎麼寫整潔一點。。。):

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n = nums1.size();
        int m = nums2.size();
        int i = 0,j = 0;
    	int s = m + n;
    	double odd;
    	if(s%2 == 0){
    		odd = 0;
    	}
    	else 
    		odd = 1;
    	s /= 2;
    	int count = 0;
    	int num1,num2;
        while(i < n && j < m) {
        	count ++;
        	if(nums1[i] > nums2[j]) {
        		if(count == s) {
        			num1 = nums2[j];
    			}
    			else if(count == s+1) {
    				num2 = nums2[j];
    			}
    			++j;
    		}
    		else {
    			if(count == s) {
        			num1 = nums1[i];
    			}
    			else if(count == s+1) {
    				num2 = nums1[i];
    			}
    			++i;
    		}
    	}
    	if(i == n) {
    		if(s + 1 > count){
    			num2 = nums2[j + s - count];
    		}
    		if(s > count) {
    			num1 = nums2[j + s - count - 1];
    		}
    	}
    	else if(j == m) {
    		if(s + 1 > count){
    			num2 = nums1[i + s - count];
    		}
    		if(s > count) {
    			num1 = nums1[i + s - count - 1];
    		}
    	}
    	if (odd){
    		return num2;
    	}
    	else 
    		return (num1+num2)/2.0;    
    }
};