[LeetCode 4]Median of Two Sorted Arrays 二分查找
2016-09-13 20:04
169 查看
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)).Example 1:
nums1 = [1, 3]nums2 = [2]The median is 2.0=======================================题目要求O(logn)的时间求解问题,很容易想到是二分搜索的方法来做,但是不同于一般的二分,这里是有两个各自有序的数组,所以需要寻找额外的约束条件。要求的是中位数,中位数最重要的性质是位于中间,也就是刚好将数组平分,左侧长度等于右侧长度。这是一个很重要的性质,有了这个性质,我只要二分其中一个数组的分割点,就可以求出另一数组的分割点。再来看如何更新左界和右界使得算法进行下去。假设两数组名为A和B,长度分别为m和n,现在二分数组A的边界i,由约束条件中位数两侧长度相等,可以求得B的边界j。当i和j是正确的边界时,应该有A[i-1] <= B[j] and B[j-1] <= A[i]。如果B[j-1] > A[i],则说明j取大了,i取小了。如果A[i-1] > B[j]说明i取大了。按照这样的规则则可以正确地二分出结果,需要注意边界条件如i=0,i=m此时不存在A[i-1]或A[i],这种情况也应该视为满足了条件。还有一点需要注意的是,题目给了两个数组,应该二分长度较小的那个数组,否则会出现j超出了范围的问题,比如,A的长度为10,B的长度为2,当二分到i=2时,得到j=4,此时访问B[j-1]出现运行错误。(我在这里WA了两次)最后是代码:class Solution {public:double findMedianSortedArrays(vector<int>& A, vector<int>& B) {int m = A.size();int n = B.size();vector<int> &nums1 = m > n ? B : A;vector<int> &nums2 = m > n ? A : B;if (m > n) {int tmp = m;m = n;n = tmp;}int lo = 0, hi = m, half = (m + n + 1) / 2;int i, j;while (lo <= hi) {i = (lo + hi) / 2;j = half - i;if (j > 0 && i < m && nums2[j-1] > nums1[i]) {lo = i+1;} else if (i > 0 && j < n && nums1[i-1] > nums2[j]) {hi = i-1;} else {break;}}int max_l, min_r;if (i == 0) max_l = nums2[j-1];else if (j == 0) max_l = nums1[i-1];else max_l = max(nums1[i-1], nums2[j-1]);if ((m+n) & 1) return max_l;if (i == m) min_r = nums2[j];else if (j == n) min_r = nums1[i];else min_r = min(nums1[i], nums2[j]);return (max_l + min_r) / 2.0;}};
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- C++二分查找在搜索引擎多文档求交的应用分析
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法