题目

There are two sorted arrays A and B 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)).

代码

class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n)
{
int total = m+n;
if(total & 0x1)
{
return Solution::find_kth(A,m,B,n,(m+n)/+);
}
else
{
return ( Solution::find_kth(A,m,B,n,(m+n)/) + Solution::find_kth(A,m,B,n,(m+n)/+) ) / 2.0;
}
}
static int find_kth(int A[], int m, int B[], int n, int k)
{
// make sure m is less or equal than n
if(m>n) return find_kth(B,n,A,m,k);
// finish conditions
if (m==) return B[k-];
if (k==) return std::min(A[],B[]);
// binary search
int pos_A = std::min(k/,m);
int pos_B = k - pos_A;
if (A[pos_A-] < B[pos_B-])
{
return Solution::find_kth(A+pos_A, m-pos_A, B, n, k-pos_A);
}
else if (A[pos_A-] > B[pos_B-])
{
return Solution::find_kth(A, m, B+pos_B, n-pos_B, k-pos_B);
}
else
{
return A[pos_A-];
}
}
};

Tips:

1. 采用二分查找,需要判断一下边界条件。

2. 这里用到一个技巧,始终保证m小于n,如果不满足就做一次转换

========================================

第二次过这道题,OJ的接口已经改成vector的了。

第一遍能记得大概的思路,但是涉及到边界细节,还是有些无力。

class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
const int m = nums1.size();
const int n = nums2.size();
int k = m+n;
if ( k & ) // odd
{
return Solution::findMedian(nums1, , m-, nums2, , n-, (m+n)/+);
}
else // even
{
return (
Solution::findMedian(nums1,, m-, nums2, , n-, (m+n)/) +
Solution::findMedian(nums1, , m-, nums2, , n-, (m+n)/+) ) /2.0;
}
}
static double findMedian(
vector<int>& nums1, int begin1, int end1,
vector<int>& nums2, int begin2, int end2,
int k
)
{
// make sure "end1-begin1" <= "end2-begin2"
if ( end1-begin1 > end2-begin2 )
{
return Solution::findMedian(nums2, begin2, end2, nums1, begin1, end1, k);
}
// finish conditions
if ( begin1>end1 ) return nums2[begin2+k-];
if ( k== ) return std::min(nums1[begin1], nums2[begin2]);
// recursive branchs
int local1 = std::min(k/, end1-begin1+);
int local2 = k-local1;
if ( nums1[begin1+local1-]<nums2[begin2+local2-] )
{
return Solution::findMedian(nums1, begin1+local1, end1, nums2, begin2, end2, local2);
}
else if ( nums1[begin1+local1-]>nums2[begin2+local2-] )
{
return Solution::findMedian(nums1, begin1, end1, nums2, begin2+local2, end2, local1);
}
else
{
return nums1[begin1+local1-];
}
}
};

tips:

主要是几个细节

1. 长度是奇数和偶数要分别处理:对于奇数长度的median就是中间的那个元素;对于偶数长度的median就是中间那两个位置元素的均值

2. 既然是递归就一定要有终止条件,这里的终止条件有两个:

  a) 有一个数组走到头了

  b) 还需要挑出来的元素个数为1(即k==1)

  遇上上述两个条件,递归可以不用往下进行了。

3. 还是强调一个技巧,需要判断两个数组长短的时候,不如再一开始就限定好传进来的哪个数组长,哪个数组短

  即,

// make sure "end1-begin1" <= "end2-begin2"
if ( end1-begin1 > end2-begin2 )
{
return Solution::findMedian(nums2, begin2, end2, nums1, begin1, end1, k);
}

这样一来就省去了很多的代码(比如已经知道了nums1的长度一定小于nums2的长度,就可以得到local1了)

4. 以前有个思维限制,既然binary search就一定要每次排除k个,那么nums1要排除k/2个,nums2要排除k/2个喽。。。这是个比较大的思维误区,由于是两个数组,每个多长都不一定,不一定两个数组都干掉相同长度;况且,k可能是奇数或者偶数,讨论起来特别麻烦。

因此,干脆确定短的一个数组往后推的长度,再用总共需要挑出来的数字减去数组一用过的长度,剩下的就是第二个数组可以往后推的长度了。

这道题非常好 思路+细节都有值得学习的地方,虽然是第二次AC了,但还是觉得受益。

【Median of Two Sorted Arrays】cpp的更多相关文章

  1. 【Remove Duplicates from Sorted List 】cpp

    题目: 第一次刷的时候漏掉了这道题. Given a sorted linked list, delete all duplicates such that each element appear o ...

  2. 【Search In Rotated Sorted Array】cpp

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7  ...

  3. 【Remove Duplicates from Sorted Array】cpp

    题目: https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove ...

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

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

  5. 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)

    转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...

  6. 【LeetCode】4. Median of Two Sorted Arrays (2 solutions)

    Median of Two Sorted Arrays There are two sorted arrays A and B of size m and n respectively. Find t ...

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

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

  8. 《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  9. 4. Median of Two Sorted Arrays(topK-logk)

    4. Median of Two Sorted Arrays 题目 There are two sorted arrays nums1 and nums2 of size m and n respec ...

随机推荐

  1. Spring MVC的测试

    测试是保证软件质量的关键. 与 Spring MVC 相关的测试,主要涉及控制器的测试. 为了测试Web项目通常不需要启动项目,需要一些Servlet相关的一些模拟对象,比如MockMVC.MockH ...

  2. linux 命令——22 find (转)

    find一些常用参数的一些常用实例和一些具体用法和注意事项. 1.使用name选项: 文 件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用.  可以使用某种文件名模式来匹 ...

  3. TFS看板规则

    就绪板列 准入条件 需求已完成交付 需求交付过程中的问题已全部解决 当前迭代需求所产生的BUG必须放入该列 之前迭代遗留的BUG 工作内容 需求实现概要设计 BUG确认 任务拆分 任务工作量估算(单位 ...

  4. Aizu 2170 Marked Ancestor(并查集变形)

    寻找根节点很容易让人联想到DisjointSet,但是DisjointSet只有合并操作, 所以询问离线倒着考虑,标记会一个一个消除,这时候就变成合并了. 因为询问和查询的时间以及标记生效的时间有关, ...

  5. POJ2112 Optimal Milking---二分+Floyd+网络流

    题目链接: https://vjudge.net/problem/POJ-2112 题目大意: k个机器,每个机器最多服务m头牛. c头牛,每个牛需要1台机器来服务. 告诉你牛与机器每个之间的直接距离 ...

  6. Struts2 In Action笔记_页面到动作的数据流入和流出

    因为回答百度知道的一个问题,仔细查看了<Struts2 In Action>,深入细致的看了 “数据转移OGNL 和 构建视图-标签”,很多东西才恍然大悟. 一直觉得国外写的书很浮,不具有 ...

  7. 搜狗浏览器特性页面JS

    http://ie.sogou.com/features4.2.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN ...

  8. for循环语句中的先后执行顺序

    for(int i=0;i<10;i++){ cout<<i; } 分析程序运行结果:for(cout<<"a";cout<<" ...

  9. servlet从服务器磁盘文件读出到浏览器显示,中文乱码问题,不要忘记在输入流和输出流都要设置编码格式,否则一个地方没设置不统一就会各种乱码

    package com.swift; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOE ...

  10. cf492E. Vanya and Field(扩展欧几里得)

    题意 $n \times n$的网格,有$m$个苹果树,选择一个点出发,每次增加一个偏移量$(dx, dy)$,最大化经过的苹果树的数量 Sol 上面那个互素一开始没看见,然后就GG了 很显然,若$n ...