这道题是那种典型的有显而易见的解法, 但是想要达到较优的时间复杂度的话就不是这么好做的题目.

我来说说我自己的思考过程 :

  1. 首先最先想到的是 O(m + n) 的解法, 也就是利用归并排序的归并将两个数组合成一个.
  2. 然后题目中要求的时间复杂度是 O(log (m + n)), 想到log自然就想到了分制之类的东西, 也就是通过用常数级别的操作来减小问题规模来求解.
  3. 其实算法导论里面有类似的题目, 当时觉得简单就没有实现, 基本思路是 : 尝试着通过不断地比较两个数组的中值来舍弃掉一些元素(就是说我们可以判断出整体中值一定是会出现在两个中值之间的, 包括边界). 于是我开始依照这种思路来进行代码的实现.

然后我碰到了如下问题 :

1. 没有考虑一开始输出的两个数组都为空的corner case.

2. 舍弃一部分元素时将中值舍去, 其实整体中值极有可能是两个中值求平均数, 也就是我上面提到的整体中值极有可能出现在两个中值之间.

3. 当较小的数组下降到2的时候, 此时必须开始求解, 因为无法舍弃更多的元素.(但是事实上, 这时候开始求解, 如果使用不插入的话, 其实情况很多, 讨论起来特别费劲)

经过了一天的尝试, 最后我放弃了这种做法. 我开始在网上寻找新的解法, 最后我觉得最好的解法是 : LeetCode 笔记系列一 Median of Two Sorted Arrays.

不过他上面的代码并不符合leetcode上提供的接口, 所以我自己给出了以下实现 :

#include <vector>
using namespace std; class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
auto size = nums1.size() + nums2.size();
if(size % 2 == 0){
return (findKth(nums1.cbegin(), nums1.cend(), nums2.cbegin(), nums2.cend(), size / 2 + 1)
+ findKth(nums1.cbegin(), nums1.cend(), nums2.cbegin(), nums2.cend(), size / 2)) / 2;
}else{
return findKth(nums1.cbegin(), nums1.cend(), nums2.cbegin(), nums2.cend(), size / 2 + 1);
}
} private:
double findKth(vector<int>::const_iterator n1Start, vector<int>::const_iterator n1End,
vector<int>::const_iterator n2Start, vector<int>::const_iterator n2End,
long k){
// make sure size1 >= size2
auto size1 = n1End - n1Start;
auto size2 = n2End - n2Start;
if(size1 < size2) return findKth(n2Start, n2End, n1Start, n1End, k); if(size1 == 0) return 0;
if(size2 == 0) return n1Start[k - 1];
if(k == 1) return std::min(n1Start[0], n2Start[0]); long p2 = std::min(size2, k / 2);
long p1 = k - p2;
if(n1Start[p1 - 1] >= n2Start[p2 - 1]){
k = p1;
n2Start += p2;
} else{
k = p2;
n1Start += p1;
}
return findKth(n1Start, n1End, n2Start, n2End, k);
} };

LeetCode.4 两个有序数组的中位数问题的更多相关文章

  1. leetcode -- 寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  2. LeetCode寻找两个有序数组的中位数

    题目: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nu ...

  3. [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 ...

  4. LeetCode Golang 4. 寻找两个有序数组的中位数

    4. 寻找两个有序数组的中位数 很明显我偷了懒, 没有给出正确的算法,因为官方的解法需要时间仔细看一下... func findMedianSortedArrays(nums1 []int, nums ...

  5. Leetcode(4)寻找两个有序数组的中位数

    Leetcode(4)寻找两个有序数组的中位数 [题目表述]: 给定两个大小为 m 和 n 的有序数组 nums1 和* nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O( ...

  6. [LeetCode] 4. 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 ...

  7. 【LeetCode】寻找两个有序数组的中位数【性质分析+二分】

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  8. leetcode题目4.寻找两个有序数组的中位数(困难)

    题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和  ...

  9. Java实现 LeetCode 4 寻找两个有序数组的中位数

    寻找两个有序数组的中位数 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 n ...

随机推荐

  1. 【AT91SAM3S】英倍特串口示例工程05-UART中,串口是怎样初始化的

    在这个示例工程的main.c文件中,进入main之后,没有发现串口功能的任何配置.直接使用了printf这个东西进行输出.将软件下载到开发板上之后,在电脑端使用串口软件,可以看板子有数据发来.说明这个 ...

  2. Struts2对Ognl的支持

                                                      Struts2对Ognl的支持 一. 写作背景 由于工作性质的变化,最近一直在研究struts2,从 ...

  3. HTTP响应状态码记录

    HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/1.0 ...

  4. python(26)查看文件的大小

    有时候,在写文件的时候需要判断文件的大小,或者删除空的文件 import os from os.path import join, getsize def getdirsize(dir): size ...

  5. JDK源码包结构分类

    最近查看JDK源码时,无意间发现几个类在陌生包里:com.sun.*.sun.*.org.*,google了一把总结了下以备他人搜索,如内容有误欢迎指正!   Jre库包含的jar文件(jdk1.6) ...

  6. EF 示例

    EF有三种数据库访问方式,这里只介绍Code First. 1.DB First,类似Linq to sql中拖拽一个DB到方案中 2.Model First,没试过,不能自动生成数据库只能生成表 3 ...

  7. ThinkPHP 3.2.3心得

    个人还是蛮喜欢tp的比其他的php框架轻(只接触过drupal.tp),而且上手容易(struts这种action的方式,对于java程序员来说).目录结构也比较简单易懂,提供的一些函数也比较实用.对 ...

  8. windows Server 2008 IE增强的安全配置关闭方法

    解决方法 开始->管理工具->服务器管理器

  9. nmap十条常用命令行格式

    1) 获取远程主机的系统类型及开放端口 nmap -sS -P0 -sV -O <target> 这里的 < target > 可以是单一 IP, 或主机名,或域名,或子网 - ...

  10. 调用jar程序,读取与jar同级的配置文件。

    System.getProperty("user.dir") + "\\Mysettings.properties";//该方法在Alimonitor里取不到绝 ...