//备注:此题实现的有问题,没达到时间复杂度要求,只实现了O(m+n)的时间复杂度,但容易理解:)
/*
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/median-of-two-sorted-arrays
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
static float mid_num_of_two_array(const int nums1[], int size1, const int nums2[], int size2)
{
int i = 0, j = 0, k = 0;
int mid_pos = 0, array[2] = {0, 0};
bool two_num_flag = ((size1 + size2) % 2 == 0) ? true : false;
mid_pos = (size1 + size2 + 1) / 2;
while ((i < size1) || (j < size2)) {
int tmp = 0;
k++;
if ((j == size2) || ((i < size1) && (nums1[i] < nums2[j]))) {
tmp = nums1[i];
i++;
} else {
tmp = nums2[j];
j++;
}
if (k == mid_pos) {
array[0] = tmp;
if (!two_num_flag)
break;
} else if (k == (mid_pos + 1)) {
array[1] = tmp;
break;
}
}
if (two_num_flag)
return ((float)array[0] + (float)array[1]) / 2;
return array[0];
}
static int test_nums1[] = {1, 3, 5, 7};
static int test_nums2[] = {2, 2};
int main(void)
{
int size1 = sizeof(test_nums1) / sizeof(int);
int size2 = sizeof(test_nums2) / sizeof(int);
float mid = mid_num_of_two_array(test_nums1, size1, test_nums2, size2);
printf("mid value = %f\n", mid);
return 0;
}
查找两个有序数列的中位数
于 2023-01-21 20:08:12 首次发布