数字问题4:在两个长度相等的数组中找上位数
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字问题4:在两个长度相等的数组中找上位数相关的知识,希望对你有一定的参考价值。
给定两个有序数组arr1和arr2,已知两个数组的长度都为N,求两个数组中所有数的上中位数。 上中位数:假设递增序列长度为n,若n为奇数,则上中位数为第n/2+1个数;否则为第n/2个数 [要求] 时间复杂度为O(logN)O(logN),额外空间复杂度为O(1)O(1) 例如:输入[1,2,3,4],[3,4,5,6],输出 3。总共有8个数,上中位数是第4小的数,所以返回3。
这个题目也是非常典型的二分法的变形题。
在B站有个视频讲解:
https://www.bilibili.com/video/BV1BA411N7oe/
因为两有序数组长度相等,所以递增序列长度一定为偶数,只需考虑一种情况即可;
import java.util.*;
public class Solution {
/**
* find median in two sorted array
* @param arr1 int整型一维数组 the array1
* @param arr2 int整型一维数组 the array2
* @return int整型
*/
public int findMedianinTwoSortedAray (int[] arr1, int[] arr2) {
// write code here
if(arr1.length == 1) return Math.min(arr1[0],arr2[0]);///特判
int n = arr1.length;///数组长度
int l1 = 0,r1 = n -1 ,l2 = 0,r2 = n -1;///初始指针
///元素个数位奇数,flag = 1,为偶数flag =0
int flag = ((r1 - l1 + 1) & 1);
while(l1 < r1){
int mid1 = l1 + ((r1 - l1) >> 1);
int mid2 = l2 + ((r2 - l2) >> 1);
///更新区域的个数,奇数,flag = 1,为偶数flag =0
flag = ((r1 - l1 + 1) & 1);
///若两数组中位数相等,整体的中位数也是这个
if(arr1[mid1] == arr2[mid2]) return arr1[mid1];
else if(arr1[mid1] > arr2[mid2]){
///如果区域个数是奇数
if(flag==1){
r1 = mid1;
l2 = mid2;
}else{
///如果区域个数是偶数
r1 = mid1;
l2 = mid2 + 1;
}
}else{
///如果区域个数是奇数
if(flag==1){
l1 = mid1;
r2 = mid2;
}else{
///如果区域个数是偶数
l1 = mid1 + 1;
r2 = mid2;
}
}
}
return Math.min(arr1[l1],arr2[l2]);
}
}
以上是关于数字问题4:在两个长度相等的数组中找上位数的主要内容,如果未能解决你的问题,请参考以下文章