LeetCode刷题笔记4寻找两个正序数组的中位数,斩获offer

} else if (rightStart > rightEnd) {//右侧没有可供选择的数

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

leftStart++;
leftEnd–;
} else {
if (nums1[leftStart] < nums2[rightStart]) {
leftStart++;
} else {
rightStart++;
}
if (nums1[leftEnd] > nums2[rightEnd]) {
leftEnd–;
} else {
rightEnd–;
}
}
leftL = leftEnd - leftStart + 1;
rightL = rightEnd - rightStart + 1;
}
if (leftL == 0) {
return (nums2[rightStart] + nums2[rightEnd]) / 2.0;
} else if (rightL == 0) {
return (nums1[leftStart] + nums1[leftEnd]) / 2.0;
} else {
return (nums1[leftStart] + nums2[rightStart]) / 2.0;
}
}

可以看到我们自己的方案虽然能够获取正确值,但是其时间复杂度为o(m+n),m n 分别为两个数组长度。

题目想要时间复杂度为 O(log (m+n)) 的算法,该如何做呢?

官方题解:二分查找法

因为两个数组都是有序,并且长度已知,假设我们将两个数组合并成一个有序数组,那么我们可以直接根据合并后数组的下标来确定中位数。假设 两个数组长度分别为 m n; k = (m+n)/2。官方的二分查找法就是在不合并数组的情况下,利用二分法来确定第k个元素原来数组上的位置。因为m n k 全部都是已知数,题目就转化成了,求两个有序数组合并后的第k个位置的数是哪一个

我们比较前A B 数组第 k/2 -1 个数 ,对于其中最小的数,连同自身共有k/2个数必定小于第k个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值