Leetcode 4.寻找两个正序数组的中位数
题目描述:给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
解题思路:新开一个数组,大小为m+n,对两个数组进行归并排序放入新开的数组中,当找到所需的中位数下标位置时,就可以计算中位数,将值返回。另外就是,对于偶数和奇数,中位数的计算方法不同。
对于长度为n的正序数组nums,这里方便公式表达,假设数组下标从1开始。如果n是偶数,那中位数为(nums[n/2]+nums[n/2+1])/2。如果n是奇数,那中位数为nums[(n+1)/2]。
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (0 == nums1.size() && 0 == nums2.size()) {
return 0;
}
int m = nums1.size(), n = nums2.size();
int i = 0, j = 0, t = 0;
vector<int> merageNums(m + n, 0);
double medianNumber = 0;
//对两数组进行归并,到达中位数时就停止寻找
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
merageNums[t++] = nums1[i++];
} else {
merageNums[t++] = nums2[j++];
}
if (0 == ((m + n) & 1)) {
//m+n为偶数时
if ((m + n) / 2 + 1 == t) {
//偶数情况下,长度为n的数组中位数:n/2和n/2+1取平均
medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
break;
}
} else {
//m+n为奇数
if ((m + n + 1) / 2 == t) {
medianNumber = merageNums[t - 1];
break;
}
}
}
while (i < m) {
merageNums[t++] = nums1[i++];
if (0 == ((m + n) & 1)) {
//m+n为偶数时
if ((m + n) / 2 + 1 == t) {
medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
}
} else {
//m+n为奇数
if ((m + n + 1) / 2 == t) {
medianNumber = merageNums[t - 1];
}
}
}
while (j < n) {
merageNums[t++] = nums2[j++];
if (0 == ((m + n) & 1)) {
//m+n为偶数时
if ((m + n) / 2 + 1 == t) {
// cout <<
medianNumber = (merageNums[t - 2] + merageNums[t - 1]) / 2.0;
}
} else {
//m+n为奇数
if ((m + n + 1) / 2 == t) {
medianNumber = merageNums[t - 1];
}
}
}
return medianNumber;
}
};