题目与样例:
思路:这题的思路很简单,就是将两个有序的数组合并成新的数组,从而找到中位数
实现代码如下:
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int count=0;//循环次数
int i=0;
int j=0;
int len1=nums1.length;
int len2=nums2.length;//数组的长度
int[] nums3 = new int[len1+len2];
int rest=(len1+len2)%2;
double median;
int index;
while(count<(len1+len2))
{
if(i<len1&&j<len2){
if(nums1[i]<=nums2[j]) {
nums3[count] = nums1[i];
count++;
i++;
}else {
nums3[count] = nums2[j];
count++;
j++;
}
}else if(i<len1&&j>=len2) {
nums3[count] = nums1[i];
count++;
i++;
}else if(j<len2&&i>=len1) {
nums3[count] = nums2[j];
count++;
j++;
}
}
index=(len1+len2)/2;
if(rest==0) {
median=((double)nums3[index-1]+(double)nums3[index])/2.0;
}else {
median=(double)nums3[index]/1.0;
}
return median;
}
}
内存消耗还是挺大的,时间也挺长的:
我们就这个例子来进行时间和空间上的优化。首先我们来优化一下时间,我们可以看到不管中位数在那个地方我们都要去遍历完两个数组,但实践上我们只需要遍历到两个数组长度除以2的位置就能够找到中位数了,于是我们可以在while循环的一开始加上如下判断代码:
if(count>(len1+len2)/2)
{
break;
}
在提交一下可以看到消耗的时间:
至于空间上暂时还有找到优化的方法,欢迎大家留言交流