题目描述:

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

解题思路:

  本题要求求解的是两个有序序列的中位数。本质上就是求两个有序序列“第k小的数“的变形。假设两个有序序列一个长为m,另一个长为n,则我们要求的就是第(m+n)/2+1个数,若m+n为偶数,则求的是第(m+n)/2和第(m+n)/2+1个数的平均数。

  接下来分析如何在O(log(m+n))的复杂度内求解第k个小的数。我们首先假设k为偶数并且两个有序序列a,b的长度都大于k/2(边界情况见代码),比较a[k/2-1]和b[k/2-1]的大小:

1)若a[k/2-1]==b[k/2-1],则该值就是我们所要求的值,因为将a和b的前k/2个元素归并后就获得了a,b序列的前k个元素,并且a[k/2-1]和b[k/2-1]相等且在最末尾。

2)若a[k/2-1]<b[k/2-1],则a的前k/2个元素中并不包含我们所求的第k小的元素,因此我们可以将其舍弃,进而递归求解剩下这些元素的第(k-k/2)小的元素。

3)若a[k/2-1]>b[k/2-1],处理方法和情况2类似

复杂度分析:

我们在求解第k小的元素的每次递归的过程中,基本上每次都要舍弃接近k/2的元素,而k的初始值为(m+n)/2,因为算法的复杂度为O(log(m+n))

代码:

int findkth(int* a,int aSize,int*b,int bSize,int k) {
int aPos,bPos;
if(aSize>bSize){//保证a始终是较短序列
return findkth(b,bSize,a,aSize,k);
}
if(aSize==0){//如果序列a空了,则直接返回
return b[k-1];
}
if(k==1){
return a[0]<b[0] ? a[0] : b[0];
} aPos = k/2<aSize ? k/2 : aSize;//如果a太短,则直接取a的末尾元素比较
bPos = k-aPos; if(a[aPos-1]==b[bPos-1]){
return a[aPos-1];
}else if(a[aPos-1]<b[bPos-1]){
return findkth(a+aPos,aSize-aPos,b,bSize,k-aPos);
}else{
return findkth(a,aSize,b+bPos,bSize-bPos,k-bPos);
} } double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { if((nums1Size+nums2Size)%2){
return findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1)*1.0;
}else{
return (findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2)
+findkth(nums1,nums1Size,nums2,nums2Size,(nums1Size+nums2Size)/2+1))/2.0;
}
}

  

LeetCode题解-----Median of Two Sorted Arrays的更多相关文章

  1. LeetCode题解——Median of Two Sorted Arrays

    题目: 找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n)). 解法: 更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值. 代码: class Solution { ...

  2. 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays

    一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...

  3. LeetCode(3) || Median of Two Sorted Arrays

    LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...

  4. Leetcode 4. Median of Two Sorted Arrays(二分)

    4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...

  5. LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)

    题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...

  6. LeetCode 4. Median of Two Sorted Arrays & 归并排序

    Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...

  7. 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)

    4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...

  8. Leetcode 4. Median of Two Sorted Arrays(中位数+二分答案+递归)

    4. Median of Two Sorted Arrays Hard There are two sorted arrays nums1 and nums2 of size m and n resp ...

  9. LeetCode 004 Median of Two Sorted Arrays

    题目描述:Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. F ...

随机推荐

  1. JavaScript跨域总结与解决办法

    什么是跨域 1.document.domain+iframe的设置 2.动态创建script 3.利用iframe和location.hash 4.window.name实现的跨域数据传输 5.使用H ...

  2. ahjesus 让Boot Camp支持创建win7 u盘安装盘

    通过修改BootCamp助理成功创建USB的windows7的安装盘. 以下将方法共享出来. 准备工作: 找到自己电脑的Boot Rom 版本.(点左上角那个小苹果标志 然后点 [关于本机] 然后点 ...

  3. Python杨辉三角算法

    #!/usr/bin/env python # -*- coding: utf-8 -*- def triangles(): n = 1 aboveList = [] while True: if n ...

  4. Android5.0新特性——兼容性(support)

    兼容性 虽然Material Design新增了许多新特性,但是并不是所有新内容对对下保持了兼容. 使用v7包 v7 support libraries r21 及更高版本包含了以下Material ...

  5. ADO.NET 实体类和数据访问类

    SQL数据库字符串注入攻击:需要使用cmd.Parameters这个集合占位符: @key 代表这个位置用这个占位符占住了 Parameters这个集合中将此占位符所代表的数据补全 cmd.Param ...

  6. 自定义XML动态配置程序

    概述 1 在做程序开发时,我们往往要用到如下两个基本模块 1> 设置程序的基础参数,如分页的参数.邮件参数等: 2> 在基于表驱动开发时,即把一些判断的逻辑放在表数据中: 2 在这两个基本 ...

  7. jQuery coveringBad 效果对比

    Covering-Bad 是一个可拉动大小的元素,覆盖在原有的元素上面,从而两者进行对比. 在线实例 实例演示1    实例演示2 使用方法 <div class="covered&q ...

  8. SQL对字符串数组的处理

    一,用临时表作为数组 复制代码代码如下: create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(co ...

  9. mysql常见的运算符及使用

    mysql中有4类运算符,它们是: 算术运算符 比较运算符 逻辑运算符 位操作运算符 算术操作符 算术操作符是SQL中最基本的操作运算符,主要有一下几种运算符: +(加). -(减). *(乘). / ...

  10. Android-AsyncTask异步任务(获取手机联系人)

    本篇随笔将讲解一下Android的多线程的知识,以及如何通过AsyncTask机制来实现线程之间的通信. 一.Android当中的多线程 在Android当中,当一个应用程序的组件启动的时候,并且没有 ...