004 - Median of Two Sorted Arrays
2015-11-10 20:59
330 查看
Median of Two Sorted Arrays
My SubmissionsQuestion
Total Accepted:
72488Total Submissions:
414372Difficulty: Hard
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
两个已排好序的数组,找到它们的median,median的意思是中间值,比如一个已排好序的数组的中间那个数,如1 2 5 median为2 , 如1 2 3 5 median为(2 + 3)/ 2.0 = 2.5
难度在于时间复杂度要为log(m + n),如果采用归并排序,再查找,时间复杂度就不能满足,得用二分法查找
我的想法是:找到这两个中位数的位置,如果数组个数为奇数个,这两个数相同,如果为偶数个两个中位数位置差一
int *findmid(int *n1, int l1, int *n2, int l2, int midnum)函数 去n1数组里找第midnum个数,以n2数组为参考,如果找不到就肯定在n2数组里
用二分法查找,这里要特殊处理的是数字重复的情况,比如5 5 5 5 5,得到的是一个区间,
int *findaim(int *n, int l, int aim) { static int ret[2]; ret[0] = ret[1] = -1; int left = 0, right = l - 1, mid; while (left <= right) { mid = (left + right) / 2; if(n[mid] < aim) left = mid + 1; else right = mid - 1; } ret[0] = left; left = 0, right = l - 1, mid; while (left <= right) { mid = (left + right) / 2; if (n[mid] > aim) right = mid - 1; else left = mid + 1; } ret[1] = left; return ret; } int *findmid(int *n1, int l1, int *n2, int l2, int midnum) { int left = 0, right = l1 - 1, mid; while(left <= right) { mid = (left + right) / 2; int *n2loc = findaim(n2, l2, n1[mid]); if ((mid + n2loc[0]) > midnum) { right = mid - 1; } else if((mid + n2loc[1]) < midnum) { left = mid + 1; } else { return n1 + mid; } } return NULL; } double findMedianSortedArrays(int* nums1, int l1, int* nums2, int l2) { if (!l1 && !l2) return 0.0; int m1, m2; int *p1, *p2; m1 = (l1 + l2 - 1) / 2; m2 = m1; if ((l1 + l2) % 2 == 0) m2 += 1; p1 = findmid(nums1, l1, nums2, l2, m1); if (!p1) p1 = findmid(nums2, l2, nums1, l1, m1); p2 = findmid(nums1, l1, nums2, l2, m2); if (!p2) p2 = findmid(nums2, l2, nums1, l1, m2); return 1.0 * (*p1 + *p2) / 2; }
相关文章推荐
- 阅读笔记《JavaScript语言精粹》
- 两车相向而行问题
- 基于DCT的JPEG图像压缩编码过程及举例
- 解答:第11周“知原理”检验题目
- iOS第五周 第二天
- 嵌入式系统安全复习(二)
- nyoj 1185 最大最小值【线段树】
- 实现字符串的一些常用字符串函数
- startService的生命周期
- DM385 IPNC GPMC+EDMA驱动学习笔记
- 日经春秋 20151110
- android SQLite实现本地登录注册功能,SQLite简单应用(android studio)
- GreenDao的使用
- 关于两层for循环的跳出
- Shell重定向文件描述符
- hdu 5122 K.Bro Sorting
- c/c++ strspn / strstr / strchr
- muduo库阅读(18)——日志记录器
- 当一个view被添加到父控件中,就会调用
- 《割绳子》《蜡笔物理学》《Contre Jour》《顽皮鳄鱼爱洗澡》等游戏用Box2D引擎实现物理部分的方法(转)