题目
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3] nums2 = [2]中位数是 2.0
示例 2:
nums1 = [1, 2] nums2 = [3, 4]中位数是 (2 + 3)/2 = 2.5
分析
两个有序数组,找中位数,要求时间复杂度位log(m+n),我写出来的是(m+n)/2。
类似于将两个有序数组重新排列成一个新的有序数组,只不过排列到一半的时候就可以停止了。
还有数组长度之和m+n的是奇是偶要分开来讨论,因为偶数位的中位数是两个相加/2。
用了不少变量做中间存储,空间复杂度o(1)。
要注意nums1数组遍历完之后,nums2数组还有数字没有遍历的情况。
代码量有些多,代码也有些乱,一心光想着睡觉了。不过思路还是比较简单哒。
代码
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int len1 = nums1.length;int len2 = nums2.length;double temp = 0;if ((len1 + len2) % 2 == 0){int mid = (len1 + len2) / 2;int mid2= mid+1;int i = 0; int j = 0;for (; i < len1 && j < len2; ) {int num = 0;if (nums1[i] <= nums2[j]){num = nums1[i];i ++;}else{num = nums2[j];j++;}mid --; mid2 --;if ( 0 == mid || 0 == mid2){ temp += num;if (mid2==0)break;}}if (mid > 0 || mid2 > 0){while (i < len1){mid --; mid2 --;if (mid == 0 || mid2 == 0) temp += nums1[i];i ++;}while (j < len2){mid --; mid2 --;if (mid == 0 || mid2 == 0) temp += nums2[j];j ++;}}return temp/2;}else{int mid = (len1+len2) /2 + 1;int i = 0; int j = 0;for (; i < len1 && j < len2;) {int num = 0;if (nums1[i] <= nums2[j]){num = nums1[i];i ++;}else{num = nums2[j];j++;}mid --;if ( 0 == mid ){temp = num;break;}}if (mid > 0){while (i < len1){mid --;if (mid == 0 ){temp = nums1[i];break;}i ++;}while (j < len2){mid --;if (mid == 0){temp = nums2[j];break;}j ++;}}return temp;}}
}
好了 去睡觉啦 晚安。