【Median of Two Sorted Arrays】cpp
题目:
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的更多相关文章
- 【Remove Duplicates from Sorted List 】cpp
		
题目: 第一次刷的时候漏掉了这道题. Given a sorted linked list, delete all duplicates such that each element appear o ...
 - 【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 ...
 - 【Remove Duplicates from Sorted Array】cpp
		
题目: https://leetcode.com/problems/remove-duplicates-from-sorted-array/ Given a sorted array, remove ...
 - 【算法之美】求解两个有序数组的中位数 — leetcode 4. Median of Two Sorted Arrays
		
一道非常经典的题目,Median of Two Sorted Arrays.(PS:leetcode 我已经做了 190 道,欢迎围观全部题解 https://github.com/hanzichi/ ...
 - 【转载】两个排序数组的中位数 / 第K大元素(Median of Two Sorted Arrays)
		
转自 http://blog.csdn.net/zxzxy1988/article/details/8587244 给定两个已经排序好的数组(可能为空),找到两者所有元素中第k大的元素.另外一种更加具 ...
 - 【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 ...
 - LeetCode 4. Median of Two Sorted Arrays & 归并排序
		
Median of Two Sorted Arrays 搜索时间复杂度的时候,看到归并排序比较适合这个题目.中位数直接取即可,所以重点是排序. 再来看看治阶段,我们需要将两个已经有序的子序列合并成一个 ...
 - 《LeetBook》leetcode题解(4): Median of Two Sorted Arrays[H]——两个有序数组中值问题
		
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
 - 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 ...
 
随机推荐
- 【ros depthimage_to_laser kinect2】
			
kinect2的深度图可以转换成激光来用,使用depthimage_to_laser 这个tf是用来给rviz显示的 1)开启kinect2 rosrun kinect2_bridge kinect2 ...
 - SQL解读XML案例
			
ALTER PROCEDURE [dbo].[GetProductList1] @Products XML AS BEGIN SET NOCOUNT ON DECLARE @Pointer INT D ...
 - display:table的几个用法(元素平分宽度,垂直居中)
			
DIV+CSS的布局已经让表格布局几乎很少用到,除非表格语义性很强的情况. display:table解决了一部分需要使用表格特性但又不需要表格语义的情况, 尤其是DIV+CSS很不方便解决的问题,比 ...
 - 美国绿卡基础知识:I-539和I-129表格的应用回复新帖
			
美国绿卡基础知识:I-539和I-129表格的应用 发布于: 2011/07/25 8:43 am 引用 I-539,就是和万金油类似的表格.不管你是要延期,还是转换身份:不管你是 B-2 ...
 - MYSQL短索引
			
优化MYSQL时,可以尽量使用短索引,如果只是为了提高读取的速度,可以优先使用聚合索引,把几个字段聚集在一起,当然缺点在于操作(写)的时候会降低效率,短索引一般都是开头几个字符基本不同的时候,可以考虑 ...
 - 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 php
			
下面我们一起为服务器安装 PHP,在使用 yum 安装软件包的时候,yum 会去默认的资源库里查看我们要安装的软件包,然后到指定的服务器上下载并安装. 但是有的时候,我们要安装的软件包并没有包含在默认 ...
 - jQuery Pagination分页插件--刷新
			
源码地址:https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/FenYE/FenYeDemo.aspx ...
 - Bootstrap 附加导航(Affix)插件
			
bootstrap 附加导航(Affix)插件允许某个div元素固定到页面中的某个位置.您可以打开或关闭使用该插件之间进行切换 后续再写
 - Hotkeys.js 2.0.2 发布,JS 网页快捷键设置,捕获键盘输入和输入的组合键快捷键,它没有依赖
			
这是一个强健的 Javascript 库用于捕获键盘输入和输入的组合键,它没有依赖,压缩只有只有(~3kb),gzip:1.9k. 更新内容: 添加测试用例: 添加更多特殊键支持: 修复bug. __ ...
 - react的redux无状态组件
			
Provider功能主要为以下两点: 在原应用组件上包裹一层,使原来整个应用成为Provider的子组件 接收Redux的store作为props,通过context对象传递给子孙组件上的connec ...