通常,找出数组中位数有多种方法~~,下面介绍几种常见的办法,演示语言使用c++
1. 合并多个数组,并sort后遍历到中位,输出值
合并采用遍历两个数组的方式,如果其中一个遍历结束,把剩下一个的后半部分都粘贴过来。
排序方法使用stl中的quicksort,sort()
假设两个数组a[m], b[n]
则合并时间复杂度为O(m+n),排序因为采用快排,所以为O(nlogn),遍历时为(m+n)/2
空间由于申请了额外数组,故为O(m+n)
似乎由于输入就是有序的,合并时可以生成新的有序数组,直接遍历到中位数就好。
其实有个更简单的方法,因为只要求返回中位数
所以就在原地排序,数到mid的时候return就行
不过懒得了
又不是赛棍
干这些事情,能跑就行了
真的到了time limited or memory limited的situation了再说吧
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| #include <iostream> #include <algorithm> using namespace std;
class Solution { public: double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2){ int i=0; j=0; vector<int> nums3; double midium; while(i < nums1.size() && j < nums2.size()){ if(nums1[i] < nums2[j]){ nums3.push_back(nums1[i]); i++; } else { nums3.push_back(nums2[j]); j++; } } if(i < nums1.size()){ while(i < nums1.size()){ nums3.push_back(nums1[i]); i++; } } else { while(j < nums2.size()){ nums3.push_back(nums2[j]); j++; } } int sum = nums1.size() + nums2.size(); if (sum % 2 == 1){ int mid = sum / 2; return nums3[mid]; } else { int mid = sum / 2; return (double(nums3[mid - 1]) + nums3[mid]) / 2; } } };
|
Thanks for wetorx and devseed for their helps
http://blog.wetor.cn
More info: devseed