LeetCode-4. Median of Two Sorted Arrayshttps://leetcode.com/problems/median-of-two-sorted-arrays/
题目描述
Given two sorted arrays nums1
and nums2
of size m
and n
respectively, return the median of the two sorted arrays.
The overall run time complexity should be O(log (m+n))
.
Example 1:
Input: nums1 = [1,3], nums2 = [2] Output: 2.00000 Explanation: merged array = [1,2,3] and median is 2.
Example 2:
Input: nums1 = [1,2], nums2 = [3,4] Output: 2.50000 Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Constraints:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
-106 <= nums1[i], nums2[i] <= 106
解题思路
【C++】
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {return findMedianSortedArrays(nums2, nums1);}
int m = nums1.size(), n = nums2.size();
int imin = 0, imax = m, halfLen = (m + n + 1) / 2;
while (imin <= imax) {
int i = (imin + imax) / 2, j = halfLen - i;
if (i < imax && nums1[i] < nums2[j - 1]) imin = i + 1;
else if (i > imin && nums1[i - 1] > nums2[j]) imax = i - 1;
else {
int maxLeft = 0;
if (i == 0) maxLeft = nums2[j - 1];
else if (j == 0) maxLeft = nums1[i - 1];
else maxLeft = max(nums1[i - 1], nums2[j - 1]);
if (((m + n) % 2) == 1) return maxLeft;
int minRight = 0;
if (i == m) minRight = nums2[j];
else if (j == n) minRight = nums1[i];
else minRight = min(nums1[i], nums2[j]);
return (maxLeft + minRight) / 2.0;
}
}
return 0.0;
}
};
如果可以容忍O(m+n)的空间复杂度
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int i = 0, j = 0, k = 0;
int length = nums1.size() + nums2.size(), mid = length / 2;
vector<int> res(length);
while (i < nums1.size() && j < nums2.size()){
if (nums1[i] < nums2[j]) {res[k++] = nums1[i++];
} else {res[k++] = nums2[j++];}
}
while (i < nums1.size()) {res[k++] = nums1[i++];}
while (j < nums2.size()) {res[k++] = nums2[j++];}
double median = 0.0;
if (length % 2 == 0) {median = (res[mid] + res[mid-1])/2.0;}
else {median = res[mid]/1.0;}
return median;
}
};
【Java】
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
if (m > n) {
int[] temp = nums1; nums1 = nums2; nums2 = temp;
int tmp = m; m = n; n = tmp;
}
int iMin = 0, iMax = m, halfLen = (m + n + 1) / 2;
while (iMin <= iMax) {
int i = (iMin + iMax) / 2, j = halfLen - i;
if (i < iMax && nums1[i] < nums2[j - 1]) {iMin = i + 1;}
else if (i > iMin && nums1[i - 1] > nums2[j]) {iMax = i - 1;}
else {
int maxLeft = 0;
if (i == 0) {maxLeft = nums2[j-1];}
else if (j == 0) {maxLeft = nums1[i - 1];}
else {maxLeft = Math.max(nums1[i - 1], nums2[j - 1]);}
if ((m + n) % 2 == 1) {return maxLeft;}
int minRight = 0;
if (i == m) {minRight = nums2[j];}
else if (j == n) {minRight = nums1[i];}
else {minRight = Math.min(nums1[i], nums2[j]);}
return (maxLeft + minRight) / 2.0;
}
}
return 0.0;
}
}