题目
给定两个大小分别为 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
题解
暂时没想到O(log(m+n))的方法,先用O(m+n)解出来
merge合并两个有序数组直到需要的中位数,根据偶数还是奇数拿结果计算中位数
package leetcode.editor.cn;
class 寻找两个正序数组的中位数 {
public static void main(String[] args) {
Solution solution = new 寻找两个正序数组的中位数().new Solution();
int[] nums1 = new int[]{1, 2};
int[] nums2 = new int[]{3, 4};
// int[] nums1 = new int[]{1, 3};
// int[] nums2 = new int[]{2};
double medianSortedArrays = solution.findMedianSortedArrays(nums1, nums2);
System.out.println(medianSortedArrays);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
if (nums1 == null && nums2 == null) {
return -1;
}
int allLength = nums1.length + nums2.length;
//merge 一直合并到第k位
int k = allLength / 2 + 1;
int[] mergeNums = merge(nums1, nums2, k);
return allLength % 2 == 0 ? (mergeNums[k - 2] + mergeNums[k - 1]) / 2D : mergeNums[k - 1];
}
private int[] merge(int[] nums1, int[] nums2, int k) {
int[] mergeNums = new int[k];
int nums1Index = 0, nums2Index = 0;
for (int i = 0; i < k; i++) {
if (nums1Index >= nums1.length) {
mergeNums[i] = nums2[nums2Index];
nums2Index++;
continue;
}
if (nums2Index >= nums2.length) {
mergeNums[i] = nums1[nums1Index];
nums1Index++;
continue;
}
mergeNums[i] = Math.min(nums1[nums1Index], nums2[nums2Index]);
if (nums1[nums1Index] < nums2[nums2Index]) {
nums1Index++;
} else {
nums2Index++;
}
}
return mergeNums;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}