一、题目
题目来源
等 级 : 困 难
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
示例 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 示例 3: 输入:nums1 = [0,0], nums2 = [0,0] 输出:0.00000 示例 4: 输入:nums1 = [], nums2 = [1] 输出:1.00000 示例 5: 输入:nums1 = [2], nums2 = [] 输出:2.00000
提示:
nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106
进阶:你能设计一个时间复杂度为 O(log (m+n)) 的算法解决此问题吗?
二、代码及思路
说是困难,但是确实是“不简单”
思路:
审题发现:最后得到的结果是一个double类型的
这 一 定 要 注 意 , 我 之 前 提 交 都 是 因 为 这 个 问 题 , 导 致 错 误
整体的一个思路:将两个数组合并,然后取中位数(科普一下中位数:当总数量为奇数时,中位数是中间的值,当总数量为偶数时,中位数是中间两个数的一半。这个你知道吗?/滑稽)
代码:
class Solution { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len = nums1.length + nums2.length; int len2, i = 0, j = 0, n = 0; double result; int[] nums = new int[len]; while(i < nums1.length && j < nums2.length){ if(nums1[i] < nums2[j]){ nums[n] = nums1[i]; n++; i++; }else{ nums[n] = nums2[j]; n++; j++; } } if(i == nums1.length){ for(int k = j; k < nums2.length; k++){ nums[n] = nums2[k]; n++; } }else if(j == nums2.length){ for(int k = i; k < nums1.length; k++){ nums[n] = nums1[k]; n++; } } if(len % 2 == 1){ len2 = len / 2 + 1; result = nums[len2 - 1]; }else{ len2 = len / 2; result = (double)(nums[len2] + nums[len2 - 1]) / 2; } return result; } }
各位小伙伴,如果有更好的思路或者代码优化欢迎一起讨论