如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
题源:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/
题目描述
给定两个大小为 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
解题思路
通过题目得知寻找两个有序数组的中位数,则需要将两个有数组进行排序,从而找到中位数。
1.数组排序
1.首先入参给定了两个数组的大小,则动态创建相应大小的新数组a
,数组大小是两个给定数组大小的和。
2.进行循环。为三个数组都创建一个标记,来判断数组比较进行的位置。如图1。
3.比较完成后,相应标记+1,如图2。
4.若一个数组已经完成比较,而另一个数组没有结束,则直接将没有结束的数组剩余数据添加到新数组的尾部。如图3,4。
2.计算有序数组的中位数
1.数组个数是奇数,中位数=(个数+1)/2。如图5
2.数组个数是偶数数,则中位数是数组中间的两个,如图6.
代码实现
double findMedianSortedArrays(int *nums1, int nums1Size, int *nums2, int nums2Size) {
int sum = nums1Size + nums2Size;
int *a = (int *) malloc(sizeof(int) * sum);
int i = 0, j = 0, k = 0;
for (; i < sum; i++) {
if (j >= nums1Size) {
a[i] = nums2[k];
k++;
continue;
}
if (k >= nums2Size) {
a[i] = nums1[j];
j++;
continue;
}
if (nums1[j] < nums2[k]) {
a[i] = nums1[j];
j++;
} else if (nums1[j] >= nums2[k]) {
a[i] = nums2[k];
k++;
}
}
if (sum % 2 != 0) {
return (double) a[sum / 2];
} else {
return (a[sum / 2] + a[sum / 2 - 1]) / 2.0;
}
}