给定两个大小为 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
    示例 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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays

    思路:
    很常考的一道题,要求时间复杂度O(log(n+m))必须使用二分。学习的官方题解做法
    4. 寻找两个正序数组的中位数-官方题解

    复杂度分析:
    时间复杂度O(log(m+n))
    空间复杂度O(1)

    1. var findMedianSortedArrays = function (nums1, nums2) {
    2. let m = nums1.length;
    3. let n = nums2.length;
    4. if (m > n) {
    5. let temp = nums1;
    6. nums1 = nums2;
    7. nums2 = temp;
    8. let tmp = m;
    9. m = n;
    10. n = tmp;
    11. }
    12. let iMin = 0, iMax = m, halfLen = Math.floor((m + n + 1) / 2);
    13. while (iMin <= iMax) {
    14. let i = Math.floor((iMin + iMax) / 2);
    15. let j = halfLen - i;
    16. if (i < iMax && nums2[j - 1] > nums1[i]) {
    17. iMin = i + 1;
    18. } else if (i > iMin && nums1[i - 1] > nums2[j]) {
    19. iMax = i - 1;
    20. } else {
    21. let maxLeft = 0;
    22. if (i === 0) {
    23. maxLeft = nums2[j - 1];
    24. } else if (j === 0) {
    25. maxLeft = nums1[i - 1];
    26. } else {
    27. maxLeft = Math.max(nums1[i - 1], nums2[j - 1]);
    28. }
    29. if ((m + n) % 2 === 1) {
    30. return maxLeft;
    31. }
    32. let minRight = 0;
    33. if (i === m) {
    34. minRight = nums2[j];
    35. } else if (j === n) {
    36. minRight = nums1[i];
    37. } else {
    38. minRight = Math.min(nums2[j], nums1[i]);
    39. }
    40. return (maxLeft + minRight) / 2;
    41. }
    42. }
    43. return 0.0;
    44. };