LeetCode题解-----Median of Two Sorted Arrays
题目描述:
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的更多相关文章
- LeetCode题解——Median of Two Sorted Arrays
题目: 找两个排序数组A[m]和B[n]的中位数,时间复杂度为O(log(m+n)). 解法: 更泛化的,可以找第k个数,然后返回k=(m+n)/2时的值. 代码: class Solution { ...
- 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
- LeetCode(3) || Median of Two Sorted Arrays
LeetCode(3) || Median of Two Sorted Arrays 题记 之前做了3题,感觉难度一般,没想到突然来了这道比较难的,星期六花了一天的时间才做完,可见以前基础太差了. 题 ...
- Leetcode 4. Median of Two Sorted Arrays(二分)
4. Median of Two Sorted Arrays 题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/ Descr ...
- LeetCode 4 Median of Two Sorted Arrays (两个数组的mid值)
题目来源:https://leetcode.com/problems/median-of-two-sorted-arrays/ There are two sorted arrays nums1 an ...
- LeetCode 4. Median of Two Sorted Arrays & 归并排序
Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...
- 第三周 Leetcode 4. Median of Two Sorted Arrays (HARD)
4. Median of Two Sorted Arrays 给定两个有序的整数序列.求中位数,要求复杂度为对数级别. 通常的思路,我们二分搜索中位数,对某个序列里的某个数 我们可以在对数时间内通过二 ...
- 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 ...
- 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 ...
随机推荐
- 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件
[源码下载] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...
- 看了一本Unity3D的教程
国内写的<Unity 3D游戏开发>. 实例挺多,对于有基础的人来说,上手会挺快的: 但进阶的东西没有涉及,可能与书的定位有关吧
- FL2440驱动添加(2): RTC(Real time clock)
一,Linux下的时间分为两种,系统时间与硬件时间(RTC芯片): 1,系统时间就是运行系统能够直接看到的时间: 2,硬件时间就是RTC芯片中的时间,断电任然有电池供电: linux系统开机时,会从R ...
- PHP生成图片验证码demo【OOP面向对象版本】
下面是我今天下午用PHP写的一个生成图片验证码demo,仅供参考. 这个demo总共分为4个文件,具体代码如下: 1.code.html中的代码: <!doctype html> < ...
- java入门基础知识点总结
JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...
- JavaScript 学习—— js获取行间样式和非行间样式
1. 问题引入 <head> <style> #div1{ width:150px; height:200px; position:absolute; left:-150px; ...
- css三角形的实现
实底三角形: <html> <head> <title></title> <style type="text/css"> ...
- iOSQuartz2D-03-定制个性头像
效果图 将一张图片剪切成圆形 在图片周围显示指定宽度和颜色的边框 实现思路 效果图中主要由不同尺寸的两大部分组成 蓝色的背景区域,尺寸等于图片的尺寸加上边框的尺寸 图片区域,尺寸等于图片的尺寸 绘制一 ...
- Swift随记
进一步理解swift拆包和解包(如有问题,大神请指教):!作用是拆包,?作用是压包(也许没有压包这个词,实际上就是转为optional类型),不管是!还是?其实都是类型转换的过程.swift语言在类型 ...
- android 之 spinner的简单使用
先看spinner的效果图: 代码: MainActivity package com.mecury.spinnertest; import java.util.ArrayList; import a ...