Day11-寻找中位数

Posted 2月2日

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day11-寻找中位数相关的知识,希望对你有一定的参考价值。

题目

给定两个有序数组,寻找数组的中位数,要求时间复杂度为O(log(m+n))

解决思路如下:

创建一个数组存放合并后的数组nums,利用归并排序的思想,将两个数组依次加入合并后的数组,当个数为奇数个时,中位数为第nums/2个,偶数时为第nums和nums-1两数的平均值

class Solution {
   public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int[] nums;
    int m = nums1.length;
    int n = nums2.length;
    nums = new int[m + n];
    if (m == 0) {
        if (n % 2 == 0) {
            return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;
        } else {

            return nums2[n / 2];
        }
    }
    if (n == 0) {
        if (m % 2 == 0) {
            return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;
        } else {
            return nums1[m / 2];
        }
    }

    int count = 0;
    int i = 0, j = 0;
    while (count != (m + n)) {
        if (i == m) {
            while (j != n) {
                nums[count++] = nums2[j++];
            }
            break;
        }
        if (j == n) {
            while (i != m) {
                nums[count++] = nums1[i++];
            }
            break;
        }

        if (nums1[i] < nums2[j]) {
            nums[count++] = nums1[i++];
        } else {
            nums[count++] = nums2[j++];
        }
    }

    if (count % 2 == 0) {
        return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
    } else {
        return nums[count / 2];
    }
}

}

以上为基础解法,时间复杂度不满足题目要求,题目要求时间复杂度为O(log(m+n)),应该利用二分查找的思想
原作者链接

以上是关于Day11-寻找中位数的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode寻找两个有序数组的中位数

ZJNU 1699 - Bits

Day 002:PAT练习--1021 个位数统计 (15 分)

LeetCode 第4题 寻找有序数组的中位数

Leetcode4. 寻找两个正序数组的中位数(二分)

Leetcode 4. 寻找两个正序数组的中位数-困难(带图)