【转】在两个长度相等的排序数组中找到上中位数

【题目】

给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。要求时间复杂度O(logN),空间复杂度O(1)

【举例】

例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]。

总共8个数,则中位数就是第 4 小的数,为 3.

例如 arr1 = [0,1,2],arr2 = [3,4,5]。

总共6个数,则中位数就是第 3 小的数,为 2.

【难度】

解答

这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

(1)、当 两个数组的长度为偶数时:

我来举个例子说明他拥有的特点吧。我们假定
arr1 = [1, 2,3,4],arr2 = [3,4,5,6]。则数组的长度为 n = 4。

分别选出这两个数组的上中位数的下标,即

mid1 = (n-1)/2 = 1。

mid2 = (n - 1)/2 = 1。

假如 arr2[mid2] > arr2[mid1],那么我们要找的目标数是一定存在于 arr1[mid1+1...n] 和 arr2[0...mid2]中。而不可能存在于 arr1[0...mid1] 和 arr2[mid2+1...n] 之中。

也就是说,我们接下来只需要在arr1[mid1+1...n] 和 arr2[0...mid2] 中查找就行了。

(2)、当两个数组的长度为奇数时:

假定 arr1 = [1, 2,3,4,5],arr2 = [3,4,5,6,7]。则数组的长度为 n = 5。

mid1 = (n-1)/2 = 2。

mid2 = (n - 1)/2 = 2。

这个时候如果 arr2[mid2] > arr1[mid1] 时,则和上面那个情况有点小差别,这时候目标数只存在于 arr1[mid1...n] 和 arr2[0...mid2]中。注意他们的差别,从arr1[mid1+1...n] => arr1[mid1...n]。

理解了这个原理,配合上代码会更好理解,代码如下:

也可以用迭代来做,反而更加简单,迭代版本如下:

原文地址:https://www.cnblogs.com/ethan2019/p/10740320.html

时间: 2024-11-05 18:52:58

【转】在两个长度相等的排序数组中找到上中位数的相关文章

算法总结之 在两个长度相等的排序数组中找到上中位数

题目描述: arr1  和 arr2   长度都为N   求两个数组中所有数的上中位数 要求 时间复杂度 O(logN)  额外空间复杂度O(1) 这道题目的方法比较好玩: 这两个数组如下表示: arr1[start1....end1]     arr2[start2...end2] 如果start1==start2  那么也有start2==end2   此时元素总个数是2个,上中位数为最小的那个 如果start1!=start2  令mid1={start1+end1}/2      mid

【递归打卡1】在两个长度相等的排序数组中找到上中位数

[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数.要求时间复杂度O(logN),空间复杂度O(1) [举例] 例如 arr1 = [1, 2,3,4],arr2 = [3,4,5,6]. 总共8个数,则中位数就是第 4 小的数,为 3. 例如 arr1 = [0,1,2],arr2 = [3,4,5]. 总共6个数,则中位数就是第 3 小的数,为 2. [难度] 中 解答 这道题可以采用递归来解决,注意,这道题数组是有序的,所以它有如下特点:

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

9.27 在两个排序数组中找到第K小的数

[题目]: 给定两个有序数组arr1和arr2,再给定一个整数k,返回所有的数中第K小的数 举例: arr1=[1, 2, 3, 4, 5],arr2=[3, 4, 5],k=1 1是所有数中第1小的数,所以返回1 arr1=[1, 2, 3],arr2=[3, 4, 5, 6],k=4 3是所有数中第4小的数,所以返回3 [要求]: 如果arr1的长度为N,arr2的长度为M,时间复杂度清达到O(log(min{M, N})),额外空间复杂度为O(1) 题目来源:左程云老师<程序员代码面试指南

【剑指Offer学习】【面试题38:数字在排序数组中出现的次数】

题目:统计一个数字:在排序数组中出现的次数. 举例说明 例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 . 解题思路 利用改进的二分算法. 如何用二分查找算法在数组中找到第一个k,二分查找算法总是先拿数组中间的数字和k作比较.如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可以了.如果中间的数字比k小,那么k只有可能出现在数组的后半段,下一轮我们只在数组的后半乓查找就可以了.如果中

数字在排序数组中出现的次数

题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 程序实现: import java.util.Scanner; public class Test38 { public static void main(String[] args) { /**  * 初始化数组,测试数据可以多种途径初始化  */   Scanner in = new Scanner(System.in); /*int[] a = 

删除排序数组中的重复数字、买卖股票的最佳时机、爬楼梯

题目1:删除排序数组中的重复数字 描述:给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度. 不要使用额外的数组空间,必须在原地没有额外空间的条件下完成. 题目2:买卖股票的最佳时机 描述:假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 题目3:爬楼梯 描述:假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶

LintCode(101)删除排序数组中的重复数字 II

题目 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 您在真实的面试中是否遇到过这个题? Yes 样例 给出数组A =[1,1,1,2,2,3],你的函数应该返回长度5,此时A=[1,1,2,2,3]. 分析 与上题思路相同,只需要增加一个记录元素出现次数的变量即可,限制最多出现2次. Python代码 class Solution: """ @param A: a list of integers @return an integer &q

Leetcode_删除排序数组中的重复项

Leetcode  删除排序数组中的重复项 题目: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用 额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示例 1: 给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2. 你不需要考虑数组中超出新长度后面的元素. 示例 2: 给定 nums = [0,0,1,1,1,2,2,3,3,4]