没错,今天又来练算法题了!
题目:
给定两个大小分别为 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
大致思路:
可以先计算数组的总长度,如果为奇数,则返回中间的值,如果为偶数,则是中间两个数的求平均。
1.定义i从0循环到length/2(<=),如果p < nums1Size(nums1没有遍历完)&&(q >= nums2Size || nums1[p] < nums2[q])(nums2遍历完/nums1[p]较小),将较小值nums1[p]赋值给next,p++;
2.否则将较小值nums2[q]赋值给next,q++;
3.如果两个数组的总长度length为偶数,返回(pre + next) / 2.0;
(否则)返回next.
代码示例:
double findMedianSortedArrays(int* nums1, int nums1s, int* nums2, int nums2s) {
int l=nums1s+nums2s;
int p=0,q=0,pre=-1,next=-1; //p,q为指针,分别表示所经过两数组的下标,pre,next分别表示当前数值与下一个数值
for(int i=0;i<=l/2;i++){
pre=next;
if(p<nums1s&&(q>=nums2s||nums1[p]<nums2[q])){
next=nums1[p];
p++;
}
else{
next=nums2[q];
q++;
}
}
if(l%2==0)
return (pre+next)/2.0;
return next;
}
这道题在leetcode中的难度是困难,但是涉及的知识点并不难,只是在思考过程中会容易遗漏细节,导致运行成功,但提交出错的情况。