TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
4. 两个排序数组的中位数
题目描述
提示帮助
提交记录
社区讨论
阅读解答
随机一题
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
- nums1 = [1, 3]
- nums2 = [2]
- 中位数是 2.0
复制代码 示例 2:
- nums1 = [1, 2]
- nums2 = [3, 4]
- 中位数是 (2 + 3)/2 = 2.5
复制代码
- int compare(int* nums1,int* nums2,int i,int j){
- if(nums1[i] >= nums2[j])
- return 1;
- return 0;
- }
- double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) {
- double ans = 0;
- int p = 0,q = 0;
- int flag = (nums1Size + nums2Size + 1)/2;
- int flag1 = ((nums1Size + nums2Size) % 2 == 0) ? 2 : 1;
- int num = flag1;
- int count = 0;
-
- while(count < flag + 1){
- int temp = 0;
- if(p < nums1Size && q < nums2Size){
- if(compare(nums1,nums2,p,q) == 1)
- temp = nums2[q++];
- else
- temp = nums1[p++];
- }
- else if(p < nums1Size)
- temp = nums1[p++];
- else if(q < nums2Size)
- temp = nums2[q++];
- count++;
- if(flag <= count && flag1 > 0){
- flag1--;
- ans += temp;
- }
- }
- return (ans/num);
- }
复制代码 这题的主要解题思路是通过双指针的方法进行的,首先通过判断该中位数为一个数还是两个数的平均值flag1 = ((nums1Size + nums2Size) % 2 == 0) ? 2 : 1;然后通过计数的方法依此的移动指针,直到移到中位数的位置然后获取值。时间复杂度为O(n + m)如果要进一步减小时间复杂度,可以考虑用二分查找的方法。
|
|