一起刷LeetCode4-Median of Two Sorted Arrays
实验室太吵了。。。怎么办啊。。。
--------------------------------------------------------------------------------------------------------------------
Median of Two Sorted Arrays
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(log(m+n))。
【心路历程】:看完这道题直接的想法就是用merge 的方法对两个数组合并排序,但是时间复杂度为:O((m+n))。
因为要求的时间复杂度为O(log(m+n)),所以很自然会想去用二分求解。于是,我最开始的思路是分别对两个数组进行二分,
然后进行比较,如果A > B,则去掉B的小于N/2的部分,去掉A的大于M/2的部分。如果A < B,则去掉A的小于M/2的部分,
去掉B的大于M/2的部分。如果 A = B ,则返回中间值。后来发现这个方法有很多不妥之处,自己实现时也是感觉有问题。
于是又开始想,发现自己确实没啥思路,就无耻的度娘了一下,发现这题可以转化成求最K值问题。原来在《剑指OFFER》上看过
最k值问题,但是却忘得一干二净了。。。
这题就是最K值问题,两个数组分别取第K/2个元素进行比较。如果A[K/2] < B[K/2] ,则忽略掉A[k/2]之前的所有元素;同理如果
A[K/2] > B[K/2] ,则忽略掉B[K/2]之前的所有元素;如果A[K/2] == B[K/2] ,则返回A[K/2] 或 B[K/2] 任意的一个元素
(其实这个想法,和我之前想到的那个还是蛮相似的。。。)。用递归很好实现,代码是学习别人的,感觉写的很好,比自己的写的好。
学习了,感觉自己代码实现能力还是不太好,要加强。
-----------------------------------------------------------------------------------------------------------------------------------
代码如下:
1 double f(int * nums1,int m,int *nums2,int n,int k) { 2 if(m > n) { 3 return f(nums2,n,nums1,m,k); 4 } 5 if(m == 0) { 6 return nums2[k - 1]; 7 } 8 if(k == 1) { 9 if(nums1[0] < nums2[0]) { 10 return nums1[0]; 11 }else { 12 return nums2[0]; 13 } 14 } 15 int pa,pb; 16 if(k/2 < m) { 17 pa = k/2; 18 pb = k - pa; 19 }else { 20 pa = m; 21 pb = k -pa; 22 } 23 if(nums1[pa - 1] < nums2[pb - 1]) { 24 return f(nums1 + pa,m - pa,nums2 , n, k - pa); 25 }else if(nums1[pa - 1] > nums2[pb - 1]) { 26 return f(nums1 ,m ,nums2 + pb, n - pb, k - pb); 27 }else { 28 return nums1[pa - 1]; 29 } 30 } 31 32 double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size) { 33 34 int total = nums1Size + nums2Size; 35 if(total % 2 == 0){ 36 return ( f(nums1,nums1Size,nums2,nums2Size,total/2) + f(nums1,nums1Size,nums2,nums2Size,total/2 + 1) ) / 2; 37 }else { 38 return f(nums1,nums1Size,nums2,nums2Size,total/2 + 1); 39 } 40 }