当前位置:实例文章 » C#开发实例» [文章]LeetCode-C#-0004.寻找两个正序数组的中位数

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。

其他信息

其他资源

Top