LeetCode(4) MedianOfTwoSortedArray

题目:给定两个排好序的数组,如何在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_h


class 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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值