给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
示例 1:
输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:
输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
题解:时间复杂度为 O(log (m+n))即把两个数组遍历一次,做题思想为用两个指针分别指向两个数组,指针所指元素较小的那个放到新的数组中去,当两个指针遍历到最右边的时候也就把两个有序数组合并成一个有序数组了。
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int n=nums1.length+nums2.length,k=0;
int[] nums=new int[n];
int i=0,j=0;
double mid;
if(n==1) return (double)nums1.length>0?nums1[0]:nums2[0];
for(;i<nums1.length&&j<nums2.length;) {
if(nums1[i]<nums2[j]) {
nums[k]=nums1[i++]; k++;
}else {
nums[k]=nums2[j++]; k++;
}
}
if(i<nums1.length) {
for(int m=i;m<nums1.length;m++) {
nums[k++]=nums1[m];
}
}
if(j<nums2.length) {
for(int m=j;m<nums2.length;m++) {
nums[k++]=nums2[m];
}
if(n%2==0) {
return (double)(nums[n/2-1]+nums[n/2])/2;
}else {
return (double)nums[n/2];
}
}
}
版权声明:本文为qq_41992047原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。