本文主要是介绍【力扣】4. 寻找两个正序数组的中位数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
4. 寻找两个正序数组的中位数
题目描述
给定两个大小分别为 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
提示:
- nums1.length == m
- nums2.length == n
- 0 <= m <= 1000
- 0 <= n <= 1000
- 1 <= m + n <= 2000
- -106 <= nums1[i], nums2[i] <= 106
解题方法
- C 归并法
double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2,int nums2Size) {int nums[nums1Size + nums2Size]; // 定义一个临时数组,用来存储合并后的数据int cnt = 0; // 定义 cnt 用来做临时数组的指针int i = 0, j = 0; // 定义 nums1、nums2 的数组指针double result = 0.0;// 按顺序将数存放进临时数组内while (i < nums1Size || j < nums2Size) {if (i == nums1Size) {nums[cnt++] = nums2[j++]; // nums1 处理完,添加 nums2 数据} else if (j == nums2Size) {nums[cnt++] = nums1[i++]; // nums2 处理完,添加 nums1 数据} else if (nums1[i] < nums2[j]) {nums[cnt++] = nums1[i]; // 按由小到大顺序数据i++;} else {nums[cnt++] = nums2[j];j++;}}if (cnt == 1) {result = nums[cnt - 1]; // 只有一个数,中位数} else {if (cnt % 2 == 0) {// 偶数个数,中位数为中间两个数的平均值result = (nums[cnt / 2] + nums[cnt / 2 - 1]) / 2.0;} else {// 奇数个数,中位数即为中间那个数result = nums[cnt / 2];}}return result;
}
这篇关于【力扣】4. 寻找两个正序数组的中位数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!