七、[LeetCode OJ]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
問題來源:Median of Two Sorted Arrays

【問題分析】

題意很簡單,求兩個有序數組組合起來後的中位數。
用最簡單直接的方法,兩個for循環遍歷兩個數組進行排序,找出排序後數組的中位數,這種時間複雜度爲O(m*n)。
這裏沒有采用分治方法,而是採用了簡單的歸併排序。假設有兩個數組A1和A2,比較兩個數組的元素A1[i]和A2[j],將較小的元素放入新數組,如果A1[i]小,則i++;如果A2[j]小,則j++,再接着比較A1[i]和A2[j],直到一個數組全部進行了比較。時間複雜度爲O(m+n)。
給出了兩份代碼,第一份是全部排完序後尋找它的中位數,第二份是排序到它的中位數後直接停止排序。

【源代碼】

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        int count = nums1.size() + nums2.size();
        int i = 0;
        int j = 0;
       	while (i < nums1.size() && j < nums2.size()) {
	       	if (nums1[i] < nums2[j]) {
	       		result.push_back(nums1[i]);
	       		i++;
		} else {
			result.push_back(nums2[j]);
			j++;
		}
	}
	while(i < nums1.size()) {
       		result.push_back(nums1[i]);
   	   	i++;
	}
	while(j < nums2.size()) { 
		result.push_back(nums2[j]);
		j++;
	}
	if (count == 0) {
        	return 0;
       	} else if (count % 2 == 0) {
		return (result[count/2] + result[count/2 - 1]) / 2.0;
	} else {
		return (result[count/2]);
	}
    }
};
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        stack<int> result;
        int count = nums1.size() + nums2.size();
        int i= 0;
        int j = 0;
       	while (i < nums1.size() || j < nums2.size()) {
       		if (i < nums1.size() && j < nums2.size()) {
	       		if (nums1[i] < nums2[j]) {
	       			result.push(nums1[i]);
	       			i++;
			} else {
				result.push(nums2[j]);
				j++;
			}
		} else {
			if (j >= nums2.size()) {
    	    			result.push(nums1[i]);
    	    			i++;
			} else {
				result.push(nums2[j]);
				j++;
			}
		}
		if (result.size() > count / 2) {
			if (count % 2 == 0) {
				int number1 = result.top();
				result.pop();
				return (number1 + result.top())/2.0;
			} else {
				return result.top();
			}
		}
	}
	return 0;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章