给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。
你可以假设 nums1 和 nums2 不会同时为空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
则中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
则中位数是 (2 + 3)/2 = 2.5
/*
* @lc app=leetcode.cn id=4 lang=cpp
*
* [4] 寻找两个有序数组的中位数
*/
// @lc code=start
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int size1 = nums1.size();
int size2 = nums2.size();
int maxSize = size1 > size2 ? size1:size2;
int pos1 = 0;
int pos2 = 0;
vector<int> vec;
int totalSize = size1 + size2;
if(size1 > 0 && size2 > 0)
{
for(int i = 0;i<totalSize;++i)
{
if(nums1[pos1] < nums2[pos2])
{
vec.push_back(nums1[pos1]);
pos1++;
}else
{
vec.push_back(nums2[pos2]);
pos2++;
}
if(pos1 == size1 || pos2 == size2) break;
}
}
int pos = pos1 == size1 ? pos2 : pos1;
vector<int>& num = pos1 == size1 ? nums2 : nums1;
for(int i = pos;i < num.size();++i)
{
vec.push_back(num[i]);
}
if(totalSize % 2 == 0) //偶数
{
return ((double)vec[totalSize / 2] + (double)vec[totalSize / 2 - 1])/2;
}else //基数
{
return vec[totalSize / 2];
}
}
};
/*
* @lc app=leetcode.cn id=4 lang=c
*
* [4] 寻找两个有序数组的中位数
*/
// @lc code=start
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
int totalSize = nums1Size + nums2Size;
int* nums = (int*)malloc(totalSize * sizeof(int));
memset(nums, 0, totalSize * sizeof(int));
int* head = nums;
double value = 0.0;
while(nums1Size > 0 && nums2Size > 0)
{
if(*nums1 < *nums2)
{
*nums++ = *nums1++;
nums1Size--;
}else
{
*nums++ = *nums2++;
nums2Size--;
}
}
while(nums1Size > 0)
{
*nums++ = *nums1++;
nums1Size--;
}
while(nums2Size > 0)
{
*nums++ = *nums2++;
nums2Size--;
}
if(totalSize % 2 == 0) //偶数
{
value = (double)(head[totalSize / 2] + head[totalSize / 2 - 1])/2;
}else
{
value = head[totalSize / 2];
}
free(head);
head = NULL;
return value;
}