LeetCode(4) MedianOfTwoSortedArray

来源:互联网 发布:centos 6删除防火墙 编辑:程序博客网 时间:2024/06/05 09:18

题目:给定两个排好序的数组,如何在O(N+M)的时间复杂度下找到它们的中位数?假设其中一个数组的长度为N,另一个数组的长度为M.

中位数的定义是这样的,如果有N个数从大到小排序,若N为奇数,则中位数为中间那1个数,若N为偶数,则中位数为中间那两个数的平均数。

code如下,按照类似归并排序中得归并的过程来写,写得相当啰嗦。

如果能够另外开辟一个空间来存放归并排序后的新数组,代码应该会简洁一些,不过这样倒是空间和时间都会多用一些了。

////  Solution.h//  LeetCodeOJ_002_MedianOf2Array#ifndef LeetCodeOJ_002_MedianOf2Array_Solution_h#define LeetCodeOJ_002_MedianOf2Array_Solution_hclass Solution {public:    double findMedianSortedArrays(int A[], int m, int B[], int n) {        // IMPORTANT: Please reset any member data you declared, as        // the same Solution instance will be reused for each test case.        int p_a=0;        int p_b=0;        double median_number=0.0;        double median_number_l=0.0;        double median_number_r=0.0;        if((m+n)%2!=0) {//两个数组的元素数目之和为奇数            int limit=(m+n)/2+1; //下标为(m+n)/2,个数为(m+n)/2+1            int count=0;            while((p_a<m)&&(p_b<n)&&(count!=limit)){                if(A[p_a]<=B[p_b]){                    median_number=A[p_a];                    p_a++;                }                else{                    median_number=B[p_b];                    p_b++;                }                count++;            }           // std::cout<<"1-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;            if(p_a==m) {                while((p_b<n)&&(count!=limit)) {                    median_number=B[p_b];                    p_b++;                    count++;                }                            }           // std::cout<<"1-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;            if(p_b==n) {                while((p_a<m)&&(count!=limit)) {                    median_number=A[p_a];                    p_a++;                    count++;                }            }           // std::cout<<"1-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;            return (double)median_number;                    } else {//两个数组的元素数目之和为偶数            int limit=(m+n)/2; //media为中间第一个数和中间第二个数的平均数。中间第一个数的下标为(m+n)/2-1,个数为(m+n)/2            int count=0;            while((p_a<m)&&(p_b<n)&&(count!=limit)){                if(A[p_a]<=B[p_b]){                    median_number_l = A[p_a];                    p_a++;                }                else{                    median_number_l = B[p_b];                    p_b++;                }                count++;            }           //std::cout<<"2-1 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;          // std::cout<<"2-1 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;          if(p_a==m) {              while((p_b<n)&&(count!=limit)) {                  median_number_l = B[p_b];                  p_b++;                  count++;              }                        }          //std::cout<<"2-2 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;          //std::cout<<"2-2 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;          if(p_b==n) {              while((p_a<m)&&(count!=limit)) {                  median_number_l = A[p_a];                  p_a++;                  count++;              }          }          //std::cout<<"2-3 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;          //std::cout<<"2-3 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;          if((p_a<m)&&(p_b<n)) {              if(A[p_a]<=B[p_b])                  median_number_r = A[p_a];              else                  median_number_r = B[p_b];          } else if(p_a<m){              median_number_r = A[p_a];          } else {              median_number_r = B[p_b];          }          //std::cout<<"2-4 limit:"<<limit<<",count:"<<count<<",median_number:"<<median_number<<std::endl;          //std::cout<<"2-4 median_number_l:"<<median_number_l<<", median_number_r:"<<median_number_r<<std::endl;          return (double)(median_number_l+median_number_r)/2;                }    }};#endif


原创粉丝点击