LeetCode-C#-0004.寻找两个正序数组的中位数
发布人:shili8
发布时间:2024-01-23 21:33
阅读次数:38
题目描述:
给定两个大小分别为m和n的正序(从小到大)数组nums1和nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为O(log(m+n))。
示例:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000解释:合并后的数组为[1,2,3],中位数是2。
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000解释:合并后的数组为[1,2,3,4],中位数是(2 +3)/2 =2.5。
代码示例:
csharppublic class Solution { public double FindMedianSortedArrays(int[] nums1, int[] nums2) { int m = nums1.Length; int n = nums2.Length; if (m > n) { int[] temp = nums1; nums1 = nums2; nums2 = temp; int tmp = m; m = n; n = tmp; } int iMin =0, iMax = m, halfLen = (m + n +1) /2; while (iMin <= iMax) { int i = (iMin + iMax) /2; int j = halfLen - i; if (i < iMax && nums2[j-1] > nums1[i]){ iMin = i +1; // i is too small } else if (i > iMin && nums1[i-1] > nums2[j]) { iMax = i -1; // i is too big } else { // i is perfect int maxLeft =0; if (i ==0) { maxLeft = nums2[j-1]; } else if (j ==0) { maxLeft = nums1[i-1]; } else { maxLeft = Math.Max(nums1[i-1], nums2[j-1]); } if ((m + n) %2 ==1) { return maxLeft; } int minRight =0; if (i == m) { minRight = nums2[j]; } else if (j == n) { minRight = nums1[i]; } else { minRight = Math.Min(nums2[j], nums1[i]); } return (maxLeft + minRight) /2.0; } } return0.0; } }
代码注释:
1. 首先判断两个数组的长度,保证nums1的长度小于等于nums2的长度。
2. 使用二分查找的方法在nums1中找到一个位置i,使得nums1[0...i-1]和nums2[0...j-1]的元素个数之和等于(m+n+1)/2。
3. 根据i的位置,计算出中位数的值。如果(m+n)为奇数,则中位数为maxLeft;如果(m+n)为偶数,则中位数为(maxLeft+minRight)/2.0。