寻找两个正序数组的中位数

问题描述:

给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。

请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。

你可以假设 nums1 和 nums2 不会同时为空。

方法:

划分数组

中位数:将一个集合划分为两个长度相等的子集,其中一个子集中的元素总是大于另一个子集中的元素。

因此,在任意位置i将集合A划分为两个部分有m+1种分法,同样可以在任意位置j将B划分为两个部分。

将left_A和left_B放入一个集合,并将right_A和right_B放入一个集合,分别命名为left_part和right_part。

只要保证,left_part中的元素,总小于right_part中的元素。并且i+j=(m+n+1)/2

i从0~m递增,A[i-1]递增,B[j]递减,因此总能找到满足条件的i。

时间复杂度:O(log min(m,n)) 空间复杂度:O(1)

java:

class Solution {

    public double findMedianSortedArrays(int[] nums1, int[] nums2) {

        if (nums1.length > nums2.length) {

            return findMedianSortedArrays(nums2, nums1);

        }

        int m = nums1.length;

        int n = nums2.length;

        int left = 0, right = m, ansi = -1;

        // median1:前一部分的最大值

        // median2:后一部分的最小值

        int median1 = 0, median2 = 0;

        while (left <= right) {

            // 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]

            // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]

            int i = (left + right) / 2;

            int j = (m + n + 1) / 2 - i;

            // nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]

            int nums_im1 = (i == 0 ? Integer.MIN_VALUE : nums1[i - 1]);

            int nums_i = (i == m ? Integer.MAX_VALUE : nums1[i]);

            int nums_jm1 = (j == 0 ? Integer.MIN_VALUE : nums2[j - 1]);

            int nums_j = (j == n ? Integer.MAX_VALUE : nums2[j]);

            if (nums_im1 <= nums_j) {

                ansi = i;

                median1 = Math.max(nums_im1, nums_jm1);

                median2 = Math.min(nums_i, nums_j);

                left = i + 1;

            }

            else {

                right = i - 1;

            }

        }

        return (m + n) % 2 == 0 ? (median1 + median2) / 2.0 : median1;

    }

}

python:

class Solution:

    def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:

        if len(nums1) > len(nums2):

            return self.findMedianSortedArrays(nums2, nums1)

        infinty = 2**40

        m, n = len(nums1), len(nums2)

        left, right, ansi = 0, m, -1

        # median1:前一部分的最大值

        # median2:后一部分的最小值

        median1, median2 = 0, 0

        while left <= right:

            # 前一部分包含 nums1[0 .. i-1] 和 nums2[0 .. j-1]

            # // 后一部分包含 nums1[i .. m-1] 和 nums2[j .. n-1]

            i = (left + right) // 2

            j = (m + n + 1) // 2 - i

            # nums_im1, nums_i, nums_jm1, nums_j 分别表示 nums1[i-1], nums1[i], nums2[j-1], nums2[j]

            nums_im1 = (-infinty if i == 0 else nums1[i - 1])

            nums_i = (infinty if i == m else nums1[i])

            nums_jm1 = (-infinty if j == 0 else nums2[j - 1])

            nums_j = (infinty if j == n else nums2[j])

            if nums_im1 <= nums_j:

                ansi = i

                median1, median2 = max(nums_im1, nums_jm1), min(nums_i, nums_j)

                left = i + 1

            else:

                right = i - 1

        return (median1 + median2) / 2 if (m + n) % 2 == 0 else median1

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352