题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2
请你找出并返回这两个正序数组的中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
规则示例
规则:
nums1.length == m
nums2.length == n
0 <= m <= 1000
0 <= n <= 1000
1 <= m + n <= 2000
- 10的6次方 <= nums1[i], nums2[i] <= 10的6次方
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2
解释:合并数组 = [1, 2, 3] ,中位数 2
示例 2:
输入:nums1 = [1, 2], nums2 = [3, 4]
输出:2.5
解释:合并数组 = [1, 2, 3, 4] ,中位数(2 + 3) / 2 = 2.5
解题分析一,时间复杂度为O(m+n)的解法
解题思路:将两个数组合并为一个数组,再求其中的中位数
我们以两个数组为例
nums1 = [1,4,5,7]
nums2 = [2,3,6,8]
知道两个数组的长度,我们可以构建一个新数组array用于存储他们
之后计算出这个新数组的中位数即可
中位数规则,合并数组长度为
注意:C#中,默认向下取整
偶数:( array[array.Length / 2] + array[array.Length / 2 - 1] ) / 2
奇数:array[array.Length / 2]
解题一,时间复杂度为O(m+n)的解法
public static float FindMedianSortedArrays(int[] nums1, int[] nums2)
{
//答题处
float midNum = 0;
//声明一个新数组,长度是两个数组之和
int[] array = new int[nums1.Length + nums2.Length];
//声明两个数组的索引,用于取出两个数组中的值进行比较,如果数组为空则索引为-1
//-1表示某个数组已经遍历完成
int nums1Index = nums1.Length == 0 ? -1 : 0;
int nums2Index =