问题:
给两个已经排好序的数组,一个长度为 m (m >= 1), 一个长度为 n (n >= 1),找出这两个数组的中位数。时间复杂度要求为 O(m+n), 空间复杂度为 O(1)。
其实这个问题本身来讲是不难的,关键的关键,是对一些边界条件的处理。
思路:
我们首先判断中位数的位置,如果 m+n 为奇数,那么中位数的位置是 第 (m+n+1)/2。 如果 m + n 为偶数,那么我们要找出第 (m+n)/2 和 第(m+n)/2 + 1, 然后求平均。
我们在两个数组上都分配一个“指针”指到起始位(假定A数组的指针为pa, B数组的指针为pb),然后根据它们值的大小,指针不断的向前推进,直到总的被遍历的数的个数为(m+n+1)/2 (奇数情况)或者为(m+n)/2 (偶数情况)。
我们在移动指针对数组中的数进行比较的时候,我们要考虑指针是否已经超过数组的大小,然后才能进行比较,这是一个非常值得注意的地方。
public class Median {
public static float median(int[] a, int[] b) {
if (a == null || b == null || a.length == 0 || b.length ==0) return 0;
int lengthA = a.length;
int lengthB = b.length;
boolean even = (lengthA + lengthB) % 2 == 0 ? true : false;
int index = -1;
int pa = 0;
int pb = 0;
float median1 = 0;
if (even == true) {
if (lengthA + lengthB == 2) return (float) (a[0] + b[0]) / 2;
while (index != (lengthA + lengthB)/2 - 1) {
if (pa < lengthA && pb < lengthB) {
if (a[pa] < b[pb]) {
median1 = a[pa];
pa++;
} else {
median1 = a[pb];
pb++;
}
} else if (pa == lengthA) {
median1 = b[pb];
pb++;
} else {
median1 = a[pa];
pa++;
}
index++;
}
if (pa > lengthA - 1) {
return (float)(median1 + b[pb]) / 2;
} else if (pb > lengthB - 1) {
return (float)(median1 + a[pa]) / 2;
} else {
int median2 = (a[pa] < b[pb]) ? a[pa] : b[pb];
return (float)(median1 + median2) / 2;
}
} else {
while (index != (lengthA + lengthB)/2) {
if (pa < lengthA && pb < lengthB) {
if (a[pa] < b[pb]) {
median1 = a[pointerA];
pointerA++;
} else {
median1 = b[pb];
pb++;
}
} else if (pa == lengthA) {
median1 = b[pb];
pb++;
} else {
median1 = a[pa];
pa++;
}
index++;
}
}
return median1;
}
public static void main(String[] args) {
int[] b = {1, 2, 3, 4};
int[] a = {5, 6, 7, 8,9,10};
System.out.println(median(a,b));
}
}
分享到:
相关推荐
已经两个已经排好序的数组,找出两个数组合起来的中间大的数字
(1)设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数,设计一个算法复杂度为O(logn)的分治算法,找出X和Y中2n个数中的中位数。(中位数:个数为奇数:中间位置上的数;个数为偶数,中间两个数的...
leetcode04_寻找两个正序数组的中位数解法.rar !!!CSDN的一个特性: 即使我设置成免费下载,被下载的次数多了之后也会变成付C币下载的了,这个很头疼. !!!因此如果没有C币但想要下载的朋友可以在b站视频下留言给我,留下...
对两个已经排好序的数组,进行合并,实现的是从文本中读取数据,执行前需要建立txt文件
寻找两个正序数组的中位数
求解找到数组A[1..n]中元素的最大值和次最大值(本小题以数组元素的比较为标准操作)的算法,并分析其最坏情况的时间复杂度。
寻找两个正序数组的中位数 .md
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] ...
用 for 循环产生 4 行 100 列二维数组,数组成员如下: ...从这个数组中提取出 2 行 50 列的二维数组,成员如下: 50,49,48…………1 56,57,58…………105 将这两个数组用数组显示件显示在前面板上。
使用Excel两个一维数组构造二维数组.rar,本例所示的Sheet1工作表已经定义了两个一维数组,利用公式对这连个数组进行加法运算,可以生成一个新的二维数组。
找出两数组相同的数(VB6.0源代码编写)比较并找出两数组相同的数,显示出相同的数值显示两个数组中相同数的位置等.
python python_leetcode面试题解之寻找两个正序数组的中位数
c# c#_Leetcode面试题解之第4题寻找两个正序数组的中位数
*功能:从两个排好序的数组A[1..m]、B[1..n]中 *找出第K大的元素。 *时间复杂度为O(lg(m)+lg(n))
设X[0:n-1]和Y[0:n-1]为2 个数组,每个数组中含有n 个已排好序的数。试设计一个O(log n)时间的算法,找出X 和Y 的2n 个数的中位数。 ★数据输入 输入数据第1 行是每个数组中元素个数n;接下来的2 行中每行有n 个整数,...
网上那种找出两个数组重复元素的代码复杂度较高,这个比较简单,一次循环搞定
刷题:给两个有序的数组,找出合并后的中位数
c语言 C语言_C语言编程基础之leetcode题解第4题寻找两个正序数组的中位数