LeetCode-4.Median of Two Sorted Arrays
2016-01-23 20:43
246 查看
题目大意:给定两个排好序的数组(可能为空),找出两数组的中位数,要求时间复杂度为log(m+n)
首先对leetcode的编译运行貌似没有超时判断,而且small和large的数据集相差很小。采用最笨的方法去实现,利用排序将两个数组合并成一个数组,然后返回中位数:
可见O(m + n) 的解法比较直观,直接merge 两个数组,然后求中位数。
更好的方法是:
我们仅仅需要第k 大的元素,是不需要“排序”这么复杂的操作的。可以用一个计数器,记录当前已经找到第m 大的元素了。同时我们使用两个指针pA 和pB,分别指向A 和B 数组的第一个元素,使用类似于merge sort 的原理,如果数组A 当前元素小,那么pA++,同时m++;如果数组B 当前元素小,那么pB++,同时m++。最终当m
等于k 的时候,就得到了我们的答案,O(k)时间,O(1) 空间。但是,当k 很接近m + n 的时候,这个方法还是O(m + n) 的。
有没有更好的方案呢?我们可以考虑从k 入手。如果我们每次都能够删除一个一定在第k 大元素之前的元素,那么我们需要进行k 次。但是如果每次我们都删除一半呢?由于A 和B 都是有序的,我们应该充分利用这里面的信息,类似于二分查找,也是充分利用了“有序”。假设A 和B 的元素个数都大于k/2,我们将A 的第k/2
个元素(即A[k/2-1])和B 的第k/2个元素(即B[k/2-1])进行比较,有以下三种情况(为了简化这里先假设k 为偶数,所得到的结论对于k 是奇数也是成立的):
• A[k/2-1] == B[k/2-1]
• A[k/2-1] > B[k/2-1]
• A[k/2-1] < B[k/2-1]
如果A[k/2-1] < B[k/2-1],意味着A[0] 到A[k/2-1 的肯定在A [ B 的top k 元素的范围内,换句话说,A[k/2-1 不可能大于A [ B 的第k 大元素。因此,我们可以放心的删除A 数组的这k/2 个元素。同理,当A[k/2-1] > B[k/2-1] 时,可以删除B 数组的k/2 个元素。当A[k/2-1] == B[k/2-1] 时,说明找到了第k 大的元素,直接返回A[k/2-1] 或B[k/2-1]即可。
因此,我们可以写一个递归函数。那么函数什么时候应该终止呢?
• 当A 或B 是空时,直接返回B[k-1] 或A[k-1];
• 当k=1 是,返回min(A[0], B[0]);
• 当A[k/2-1] == B[k/2-1] 时,返回A[k/2-1] 或B[k/2-1]
该程序应用了标准库函数的里的现成函数,可以很大提高代码编写效率。
相关文章推荐
- js简化判断是否为手机访问
- Activity
- 送友
- 在 Visual Studio 调试器中指定符号 (.pdb) 和源文件(转载自RSS翻译)
- MyBatis简单的增删改查以及简单的分页查询实现
- linux terminal theme
- 关于乌班图基础的linux命令1
- Swift学习笔记9--错误控制
- 20. Valid Parentheses
- Swift 文档注释规范
- 【技巧】对拍
- Fix【推荐】
- Amazon RDS的通用型存储(SSD)
- Android BLE与终端通信(三)——客户端与服务端通信过程以及实现数据通信
- 包管理软件
- 使用 VisualVM 进行性能分析及调优
- 解决 Ubuntu 14.04 无法调节屏幕亮度的问题
- 挂载NTFS分区的两种方法
- 1-12 ARP协议
- IO流 创建java文件列表