leetcode 4. Median of Two Sorted Arrays
2017-10-09 15:35
435 查看
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
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] ,
若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
取A[k / 2] B[k / 2] 比较,
如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。
头条面试问到了!
nums1 = [1, 3]
nums2 = [2]
The median is 2.0
Example 2:
nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5
对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] ,
若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
取A[k / 2] B[k / 2] 比较,
如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。
class Solution { public: double findMedianSortedArrays(vector<int>& A, vector<int>& B) { int k = A.size() + B.size(); if (k % 2 == 1) return double(find_k( k/2 + 1, A, B)); else return double(find_k(k/2, A, B) + find_k(k/2 + 1, A, B) ) / 2; } int find_helper(int k, vector<int>& vt1, vector<int>& vt2, int pos1, int pos2) { if (pos1 == vt1.size()) //vt1已经没有可以用来比较的了。直接返回vt2的对应位 { return vt2[pos2 + k - 1]; } else if (pos2 == vt2.size()) { return vt1[pos1 + k - 1]; } if (k == 1) //如果k==1,比较vt1和vt2的当前开始位 { return min(vt1[pos1], vt2[pos2]); } int kk = k / 2; if (vt1.size() - pos1 >= kk && vt2.size() - pos2 >= kk) //vt1和vt2都有kk个可以用来比较 { if (vt1[pos1 + kk - 1] <= vt2[pos2 + kk - 1]) return find_helper(k - kk, vt1, vt2, pos1 + kk, pos2); else return find_helper(k - kk, vt1, vt2, pos1, pos2 + kk); } else if (vt1.size() - pos1 < kk) { if (vt1[vt1.size() - 1] <= vt2[vt1.size() - pos1 - 1]) return find_helper(k - vt1.size() - pos1, vt1, vt2, vt1.size(), pos2); else return find_helper(k - vt1.size() - pos1, vt1, vt2, pos1, pos2 + vt1.size() - pos1); } else //如果vt2后面的部分不够kk个了,就只比较vt2的最后一个 { if (vt1[vt2.size() - pos2 - 1] <= vt2[vt2.size() - 1]) return find_helper(k - vt2.size() - pos2, vt1, vt2, pos1 + vt2.size() - pos2, pos2); else return find_helper(k - vt2.size() - pos2, vt1, vt2, pos1, vt2.size()); } return -1; } int find_k(int k, vector<int>& vt1, vector<int>& vt2) { return find_helper(k, vt1, vt2, 0, 0); } };
头条面试问到了!
相关文章推荐
- [leetcode] Median of Two Sorted Arrays
- [LeetCode]#4 Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays Java
- LeetCode Median of Two Sorted Arrays
- LeetCode-4:Median of Two Sorted Arrays
- Leetcode 4 Median of Two Sorted Arrays
- LeetCode: Median of Two Sorted Arrays
- LeetCode Median of Two Sorted Arrays
- 25th Feb: LeetCode 4 Median of Two Sorted Arrays
- leetcode:Median of Two Sorted Arrays
- LeetCode Median of Two Sorted Arrays
- Leetcode|Median of Two Sorted Arrays
- LeetCode Median of Two Sorted Arrays 在两个已排列的数组中找出中位数。时间复杂度为O(log(min(N,M))
- Leetcode-median of two sorted arrays
- Median of Two Sorted Arrays[leetcode] O(nlogn)的两种思路
- leetcode 4 golang Median of Two Sorted Arrays
- 记LeetCode_4: Median of Two Sorted Arrays
- [LeetCode] Median of Two Sorted Arrays
- LeetCode 4. Median of Two Sorted Arrays
- LeetCode004----Median of Two Sorted Arrays