题目描述:
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)).
题目的关键是时间复杂度的要求,不然直接将两个数组凑起来就行,不过为O(m + n);
由于两个数组都已排好序,可以分别取两个数组的中位数进行比较假设分别为A,B,若A < B,显然第一个数组中小与
A的肯定小与整体的中位数(设为C),反之亦然,当然若A
== B,A就是C了。到这里,转换一下思维,何为中位数?
不就是整个数据中处于中间位置的那个数吗(先不分奇偶,意思懂就行),那么中位数也就是正好有一半数据比其小的
那个数,这好像是一个比较经典的问题,即求第K小的数据!想到了这个地方,题目的解法也就出来了,代码如下:
int FindMedium(vector<int>::iterator iter1, int m, vector<int>::iterator iter2, int n, int k) { if(m > n) return FindMedium(iter2, n, iter1, m, k); if(m == 0) return (*(iter2 + k - 1)); if(k == 1) return min(*iter1, *iter2); int tmp1 = min(k / 2, m); int tmp2 = k - tmp1; if(*(iter1 + tmp1 - 1) < *(iter2 + tmp2 - 1)) return FindMedium(iter1 + tmp1, m - tmp1, iter2, n, tmp2); else if (*(iter1 + tmp1 - 1) > *(iter2 + tmp2 - 1)) return FindMedium(iter1, m, iter2 + tmp2, n - tmp2, tmp1); else return *(iter1 + tmp1 - 1); } class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) { int total = nums1.size() + nums2.size(); vector<int>::iterator iter1 = nums1.begin(); vector<int>::iterator iter2 = nums2.begin(); if(total & 0x01) return FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2 + 1); else return ( FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2) + FindMedium(iter1, nums1.size(), iter2, nums2.size(), total / 2 + 1) ) * 1.0 / 2; } };
格式调了半天,也没对好,不晓得又出什么问题了,吐槽下CSDN。。。
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-31 13:36:39