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

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

  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. each循环

    var NA_COUNT=0; var NG_OK_COUNT=0; //获取所有检验明细为同一个编号的下拉选项,看有没有不是N/A的下拉选项 $("#@(Perfix)tbData sel ...

  2. LINUX下WIFI默认连接

    #! /bin/sh ifconfig wlan0 upiwconfig wlan0 key 123456iwconfig wlan0 essid "rat-linux"iwcon ...

  3. ORACLE 10G 闪回建议

    Flashback Tips The following tips and restrictions apply to using flashback features. Flashback Tips ...

  4. SimpleDateFormat做成员或者静态成员多线程安全隐患

    转自:http://blog.csdn.net/jeamking/article/details/7183958 有时我们在同一个类中都是使用同一种日期格式,又或者为了减少new SimpleDate ...

  5. VS2010 项目引用了DLL文件,也写了Using,但是编译时提示:未能找到类型或命名空间名称 <转>

    昨天写了一个很小的winform程序,其中引用了自己写的两个dll文件. 本来认为轻松搞定,结果一编译居然提示:未能找到类型或命名空间名称..... 于是删掉两个dll重新引用,再编译结果依旧!很是郁 ...

  6. 小学了一下css hack

    实例讲解: Hack应用情境(一) 适用范围:IE:6.0,IE7.0,IE8.0之间的兼容 实例说明: 使用了渐进识别的方式,从总体中逐渐排除局部.首先,巧妙的使用“\9”这一标记,将IE游览器从所 ...

  7. 华为OJ题目:刷题

    题目描述: 新入职华为的小伙伴们都有在oj上面刷题的任务,共需要刷100道初级题,45道中级题,5道高级题,其中,做出来的高级题如果超标可以当初级或者中级题,做出来的中级题如果超标可以当初级题.每天, ...

  8. 框架操作DOM和原生js操作DOM比较

    问题引出 对于Angular和React操作DOM的速度,和原生js操作DOM的速度进行了一个比较: 一个同学做的demo 代码如下: <!DOCTYPE html> <html n ...

  9. Visual Studio 中可执行文件中嵌入的清单文件

    概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件.如果您要开发"认证 Windows Vista&qu ...

  10. Opera放弃自家内核转投WebKit的背后(转)

    Opera在2月13日宣布用户突破3亿,并且带着这3亿用户投入WebKit阵营,自家的Presto内核将会走入历史.Opera为什么选择在现在这个时间点放弃自有内核?之前Opera的坚持自主研发一直被 ...