LeetCode[Day 2] Median of Two Sorted Arrays 题解

Stella981
• 阅读 481

Median of Two Sorted Arrays

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)).


思路

题目最后要求给出的算法复杂度是O(log(m+n)),很明显这道题要用二分的想法去做。所以就开始考虑通过比较A[mid]和B[mid]之间的关系来到达二分的效果。算了半天发现不太对劲,搞不出来啊。还要考虑m和n之间的大小,一头雾水。于是,我又一次厚着脸皮看了下别人的题解,嘻嘻。虽然我现在很渣,但是我相信,以后我会很拽。

其实之前的思路大致方向是对的,但是对二分的理解也不是很彻底,思路被局限死了。应该通过二分,筛选掉一半的一半,之后进行递归。这样算法的复杂度就是O(log((m+n)/2))。

这里可以考虑这道题的普遍结论,求出两个数列合并后的第k个元素,想法是类似的。

首先将k个元素分成数量为ta和tb两个部分,比较A[ta-1]和B[tb-1]的大小,筛选掉其中某一部分的一半。比如,

如果A[ta-1]>B[tb-1],那么可以断言在前k-1小的元素集合中一定包含B[0...tb-1]这tb个元素。每次的操作,至多减少k/2个元素,所以整个算法的复杂度是O(logk)。

具体的可以看代码。


代码

!!!什么,竟然WA。这种代码一定不是我写的。

if ((m+n)%2)

好吧,我承认我是逗比。这个错误看了10+分钟。下面是AC的代码

class Solution {
public:
    double findKthElement(int A[], int m, int B[], int n, int k) {
        if (m < n) {
            return findKthElement(B, n, A, m, k);
        }
        if (n == 0) return A[k-1];
        if (k == 1) return min(A[0], B[0]);
        int tb = min(k/2, n);
        int ta = k-tb;
        if (A[ta-1] > B[tb-1]) {
            return findKthElement(A, m, B+tb, n-tb, k-tb);
        }
        if (A[ta-1] < B[tb-1]) {
            return findKthElement(A+ta, m-ta, B, n, k-ta);
        }
        if (A[ta-1] == B[tb-1]) {
            return A[ta-1];
        }
    }
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        if ((m+n)%2 == 0) {
            return (findKthElement(A, m, B, n, (m+n)/2)+findKthElement(A, m, B, n, (m+n)/2+1))/2;
        }
        else {
            return findKthElement(A, m, B, n, (m+n+1)/2);
        }
    }
};
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
JS 苹果手机日期显示NaN问题
问题描述newDate("2019122910:30:00")在IOS下显示为NaN原因分析带的日期IOS下存在兼容问题解决方法字符串替换letdateStr"2019122910:30:00";datedateStr.repl
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Stella981 Stella981
3年前
IE7、IE8、IE9对min
问题:    IE7、IE8、IE9对minheight不识别,其他无问题解决:   box{width:100px;height:35px;}   htmlbodybox{width:auto;height:auto;width:100px;minheight:35px;} 实例:
Stella981 Stella981
3年前
LeetCode [Day 4] Add Two Numbers 题解
AddTwoNumbersYouaregiventwolinkedlistsrepresentingtwononnegativenumbers.Thedigitsarestoredinreverseorderandeachoftheirnodescontainasingledigit
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这