两个有序数组求中位数

  参见:http://soj.sysu.edu.cn/show_problem.php?pid=1004&cid=569

  果然人脑是有问题的,测试样列还是随机生成的好

Design an efficient fine_median algorithm of logrithmic running time.

typedef int Comparable;

Comparable find_median(const vector<Comparable> &l1, const vector<Comparable> &l2);
/*
Pre:  The ordered lists l1,l2 are not all empty.
Post: The median of the two lists combined in order is returned. If the
size of the merged list is even, then the first of the two medians
is returned. For exmaple, l1 =(1,2), l2=(1,3,4,5), then 2 is returned.
*/

  

#include <vector>
using std::vector;
typedef int Comparable;
//#include <iostream>
//#include <cstdlib>
//using std::cout;
Comparable find_median(const Comparable *arrA, int lenA, const Comparable *arrB, int lenB) {
//  static int record = 0;
//  ++record;
//  if (record % 100 == 0) {
//    system("pause");
//  }
//  cout << "Times " << record << "\narrA: ";
//  for (int i = 0; i < lenA; ++i) {
//    cout << arrA[i] << ‘ ‘;
//  }
//  cout << ‘\n‘;
//  cout << "arrB: ";
//  for (int i = 0; i < lenB; ++i) {
//    cout << arrB[i] << ‘ ‘;
//  }
//  cout << "\n\n";

  if (lenA == lenB && lenA == 1) {
    return (*arrA > *arrB ? *arrB: *arrA);
  }
  int midA = (lenA - 1) / 2;
  int midB = (lenB - 1) / 2;
  if (lenA == 1) {
    if (lenB % 2 == 1) {
      if (arrA[0] >= arrB[midB]) {
        return arrB[midB];
      } else if (arrA[0] <= arrB[midB - 1]) {
        return arrB[midB - 1];
      } else {
        return arrA[0];
      }
    } else {
      if (arrA[0] >= arrB[midB + 1]) {
        return arrB[midB + 1];
      } else if (arrA[0] <= arrB[midB]) {
        return arrB[midB];
      } else {
        return arrA[0];
      }
    }
  } else if (lenB == 1) {
    return find_median(arrB, lenB, arrA, lenA);
  }
  int l = (midA <= midB? midA: midB);
  //cout << "l: " << l << " midA: " << midA << " midB: " << midB << ‘\n‘;
  if (lenA == 2 || lenB == 2) {  //
    ++l;
  }
  if (arrA[midA] == arrB[midB]) {
    return arrA[midA];
  } else if (arrA[midA] < arrB[midB]) {
    return find_median(arrA + l, lenA - l, arrB, lenB - l);
  } else {
    return find_median(arrA, lenA - l, arrB + l, lenB - l);
  }
}

Comparable find_median (const vector<Comparable> &l1, const vector<Comparable> &l2) {
  return find_median(&l1[0], l1.size(), &l2[0], l2.size() );
}
// 下面这个是O(n)版本,用于检测正确性
using std::vector;
Comparable find_median2(const vector<Comparable> &l1, const vector<Comparable> &l2) {
  vector<Comparable>::const_iterator it1, it2;
  it1 = l1.begin();
  it2 = l2.begin();
  unsigned int mid = (l1.size() + l2.size() - 1) / 2;
  unsigned int k = 0;
  while (k < mid && it1 != l1.end() && it2 != l2.end()) {
    if (*it1 <= *it2) {
      ++it1;
    } else {
      ++it2;
    }
    ++k;
  }
  while (it1 != l1.end() && k < mid) {
    ++it1;
    ++k;
  }
  while (it2 != l2.end() && k < mid) {
    ++it2;
    ++k;
  }
  if (it1 == l1.end()) {
    return *it2;
  } else if (it2 == l2.end()) {
    return *it1;
  } else {
    return (*it1 < *it2? *it1: *it2);
  }
}

// 测试程序
#include <algorithm>
#include <iostream>
#include <ctime>
#include <cstdlib>
using std::cout;
using std::sort;
int main() {
  //vector<Comparable> l1 = {1, 2, 4.2, 7, 56};
  vector<Comparable> l1;
  vector<Comparable> l2;
  srand(time(0));
  int N = 100;  // 测试样例个数
  while (N--) {
    l1 = vector<Comparable>(rand() % 4 + 1);
    l2 = vector<Comparable>(rand() % 4 + 1);
    for (auto &i : l2) {
      i = rand() % 100;;
    }
    for (auto &i : l1) {
      i = rand() % 100;
    }
    sort(l1.begin(), l1.end());
    sort(l2.begin(), l2.end());
    int m1 = find_median(l1, l2);
    int m2 = find_median2(l1, l2);
    cout << m1 << ‘\n‘;
    cout << m2 << ‘\n‘;
    if (m1 != m2) {
      system("pause");
    }
  }
}
时间: 2024-10-03 22:15:39

两个有序数组求中位数的相关文章

[LeetCode] 4. 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)),看到这个时间复杂度,自然想到用二分搜索Binary Search. 对于一个长度为n的已

【LeetCode】4. 寻找两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 分析:给定两个有序的数组,求中位数,难度系数给的是 Hard,希望的复杂度是 lo

寻找两个有序数组的中位数 C++实现leetcode系列(四)

给定两个大小为 m 和 n 的有序数组 nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 这道题让我们求两个有序数组的中位数,而且限制了时间复杂度为 O(log (m+n))

leetcode第四题:两个有序数组的中位数

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 代码如下: def median(A, B): m, n = len(A), le

寻找两个有序数组的中位数

题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2.          请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)).          你可以假设 nums1 和 nums2 不会同时为空.          示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 var findMedianSortedArrays = function(nums1, nums2) { var arr = Array

leetcode刷题四&lt;寻找两个有序数组的中位数&gt;

给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 思路简单直接撸代码吧 double findMedianSortedArrays(

LeetCode刷题:第四题 寻找两个有序数组的中位数

题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.5 直接上代码: double findMedianSortedArray

[LeetCode] 4. 寻找两个有序数组的中位数

题目链接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays/ 题目描述: 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例: 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] n

《LeetCode-0004》 寻找两个有序数组的中位数-Median of Two Sorted Arrays

题目给定两个大小为 m 和 n 的有序数组nums1和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 不会同时为空. 示例 1: nums1 = [1, 3]nums2 = [2] 则中位数是 2.01234示例 2: nums1 = [1, 2]nums2 = [3, 4] 则中位数是 (2 + 3)/2 = 2.51234概念中位数的概念:对于有限的数集,可以通过把所有观察值高低排序后找出正中间