004Median of Two Sorted Arrays
2015-08-28 08:36
92 查看
题目
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)).代码
double findK(int* nums1, int nums1Size, int* nums2, int nums2Size,int k) { if(nums1Size<nums2Size) return findK(nums2,nums2Size,nums1,nums1Size,k); if(nums2Size==0) return nums1[k-1]; if(k==1) return nums1[0]>nums2[0]?nums2[0]:nums1[0]; int tmpb = (k/2>nums2Size?nums2Size:k/2); int tmp = k-tmpb; if (nums1[tmp-1]>nums2[tmpb-1]) { return findK(nums1,nums1Size,nums2+tmpb,nums2Size-tmpb,k-tmpb); } else if(nums1[tmp-1]<nums2[tmpb-1]) { return findK(nums1+tmp,nums1Size-tmp,nums2,nums2Size,k-tmp); } else return nums1[tmp-1]; } double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { int total = nums1Size + nums2Size; if (total & 0x1) return findK(nums1, nums1Size, nums2, nums2Size, total / 2 + 1); else return (findK(nums1, nums1Size, nums2, nums2Size, total / 2) + findK(nums1, nums1Size, nums2, nums2Size, total / 2 + 1)) / 2; }
思路
如果以遍历的方式来从两个数组的最小端开始遍历寻找中位数,那么复杂度为O((m+n)/2)。为了使得复杂度变为log(m+n),那么我们就不能一个个查找了,需要以一种折半的方式来查找。
如果在两个数组中查找第k个数字(k初始为m/2+n/2),且默认第二个数字比第一个数组短,那么我们只需要比较两个数组的第k/2个数字的大小,如果第一个数组中的大,那么中位数必定不在第二个数组的前k/2个,我们就可以瞬间排除k/2个数字,而不是一个个排除,这样每次排除k/2个数字,效率会变成log(m+n)。
相关文章推荐
- Flex 布局基础语法篇
- App 控件定位讲解 (hierarchyviewer 篇)
- 是用VLC API将RTSP流convert为视频文件
- Win10预览版10532更新内容大全汇总
- 获取IP地址
- 黑马程序员-----Java基础-----网络编程
- POJ 2375 解题报告
- 《程序开发心理学(银年纪念版)》 试读笔记及感悟
- JQuery实现数字滚动增加的效果
- UVA 11019 Matrix Matcher(字符hash)
- OC:copy 与 retain 的区别
- CentOS学习4_Error mounting: mount: wrong fs type, bad option, bad superblock on /dev/sdb1简单解决方法
- C#封装SQLDMO操作SQL Server 2000的类
- java多线程(九)阻塞队列
- 更加简洁易用——wangEditor富文本编辑器新版本发布
- Windows下配置wampserver
- Win10 Build 10532预览版更新了哪些内容弄?三项重要改进汇总
- 他们能看到生活中正在变化的事物,他们能看到前途,告诉自己,“我能通过这个来创业”
- 任性动图--傻瓜式创作动图、创作动图就是这么简单、就是这么任性!!!
- maven一键部署tomcat war包