码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode Median of Two Sorted Arrays

时间:2014-09-19 20:59:36      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   os   ar   for   数据   div   

  1 #include <iostream>
  2 #include <cstdlib>
  3 #include <cmath>
  4 #include <algorithm>
  5 
  6 using namespace std;
  7 
  8 class Solution {
  9 public:
 10     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 11         double ma = 0;
 12         double mb = 0;
 13 
 14         bool empty_a = A == NULL || m < 1;
 15         bool empty_b = B == NULL || n < 1;
 16         
 17         if (!empty_a) ma = (A[(m - 1) / 2] + A[m/2]) / 2.0;
 18         if (!empty_b) mb = (B[(n - 1) / 2] + B[n/2]) / 2.0;
 19         
 20         if (empty_a && empty_b) { // will this happen ?
 21             return 0;
 22         } else if (empty_a) {
 23             return mb;
 24         } else if (empty_b) {
 25             return ma;
 26         }
 27         
 28         double low = 0, high = 0;
 29 
 30         if (ma > mb) {
 31             low = mb, high = ma;
 32         } else if (ma < mb) {
 33             low = ma, high = mb;
 34         } else {
 35             return ma;
 36         }
 37         
 38         double precise = 0.1;
 39         double mv = 0;
 40         int total = m + n;
 41         int half  = total / 2;
 42         bool declared = false;
 43         while(high - low > precise) {
 44             mv = (high + low) / 2.0;
 45             int* pa = lower_bound(A, A + m, mv);
 46             int* pb = lower_bound(B, B + n, mv);
 47             int lh = (pa - A) + (pb - B);
 48 
 49             if (lh < half) {        // the median assumed is too small, so increase it
 50                 low = mv;
 51             } else if (lh > half) { // the median assumed is too big, so decrease it
 52                 high= mv;
 53             } else {
 54                 declared = true;
 55                 // divided into odd/even case. should re-calculate the mv
 56                 // for even case median calculated from two adjacent numbers in
 57                 // the merged array, we assume that one is mmore and the other
 58                 // is mless (median = (mmore + mless) / 2.0 )
 59                 int mmore = 0;
 60                 // find bigger number to compute median for even case.
 61                 if (pa == A + m && pb == B + n) {
 62                     // should not happen;
 63                     cout<<"[1]should not happen"<<endl;
 64                 } else if (pa == A + m) {
 65                     mmore = *pb;
 66                 } else if (pb == B + n) {
 67                     mmore = *pa;
 68                 } else {
 69                     if (*pa < *pb) {
 70                         mmore = *pa;
 71                     } else {
 72                         mmore = *pb;
 73                     }
 74                 }
 75                 
 76                 // for odd case. the mv is equal to value of mmore
 77                 if (half * 2 != total) {
 78                     mv = mmore;
 79                     break;
 80                 }
 81                 
 82                 // find samller number to compute median for even case.
 83                 pa--, pb--;
 84                 int mless = 0;
 85                 if (pa < A && pb < B) {
 86                     // should not happen
 87                     cout<<"[2]should not happen"<<endl;
 88                 } else if (pa < A) {
 89                     mless = *pb;
 90                 } else if (pb < B) {
 91                     mless = *pa;
 92                 } else {
 93                     if (*pb > * pa) {
 94                         mless = *pb;
 95                     } else {
 96                         mless = *pa;
 97                     }
 98                 }
 99                 mv = (mless + mmore) / 2.0;
100                 break;
101             }
102         }
103         if (declared) { // median value is on the boundary
104             return mv;
105         }
106         if (fabs(mv - ma) < fabs(mv - mb)) {
107             return ma;
108         } else {
109             return mb;
110         }
111     }
112 };
113 
114 int main() {
115     Solution s;
116     int A[] = {1, 1};
117     int B[] = {1, 2};
118     int m = sizeof(A) / sizeof(A[0]);
119     int n = sizeof(B) / sizeof(B[0]);
120     
121     cout<<s.findMedianSortedArrays(A, m, B, n)<<endl;
122     system("pause");
123     return 0;
124 }

写得好乱啊, 这个还是二分搜索吧,只不过用来决定选择前半部还是后半部的评价标准变了,由原来的与一个确定常数数比较变为两个变量之间的比较(lh 与 half之间的数量关系),搜索空间由一个数组变为一个数值区间(其实都可以看做解的值域)。230ms+。

题目中提到"The overall run time complexity should be O(log (m+n)).",其实log前面有常数,由于数据是整数,经过32次二分搜索,可以使数值空间降到1以内,再过4次可以降到0.1内。

 

再用O(n)的简单解法感觉时间上差不多,不知为何

 1 class Solution {
 2 public:
 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {
 4         int ia = 0, ib = 0;
 5         int it = -1;
 6         int im = (m + n - 1) / 2;
 7         int val= 0;
 8 
 9         bool empty_a = A == NULL || m < 1;
10         bool empty_b = B == NULL || n < 1;
11         
12         while (!empty_a && ia < m && !empty_b && ib < n && it < im) {
13             if (A[ia] < B[ib]) {
14                 val = A[ia++];
15             } else {
16                 val = B[ib++];
17             }
18             ++it;
19         }
20         
21         while (!empty_a && ia < m && it < im) {
22             val = A[ia++];
23             it++;
24         }
25         while (!empty_b && ib < n && it < im) {
26             val = B[ib++];
27             it++;
28         }
29         if ((m + n) & 1) {
30             return val;
31         } else {
32             int val2 = 0;
33             if ((empty_a || ia >= m) && (empty_b || ib >= n)) {
34                 // should not happen
35             } else if (empty_a || ia >= m) {
36                 val2 = B[ib];
37             } else if (empty_b || ib >= n) {
38                 val2 = A[ia];
39             } else {
40                 val2 = A[ia] > B[ib] ? B[ib] : A[ia];
41             }
42             return (val + val2) / 2.0;
43         }
44     }
45 };

 

LeetCode Median of Two Sorted Arrays

标签:style   blog   color   io   os   ar   for   数据   div   

原文地址:http://www.cnblogs.com/lailailai/p/3982103.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!