文章

166

粉丝

0

获赞

0

访问

10.1k

头像
2011年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年6月24日 20:09
阅读数 88

  1. 预处理: 如果序列长度为 1,直接比较两个序列的唯一元素,较小的那个为中位数。

  2. 递归分治:

    • 分别找到序列 A 和 B 的中位数,设为 midA 和 midB
    • 比较 midA 和 midB
      • 如果 midA == midB,则 midA(或 midB)即为两个序列的中位数。
      • 如果 midA < midB,则说明中位数位于: A 的后半部分 或者 B 的前半部分。
      • 如果 midA > midB,则说明中位数位于: A 的前半部分 或者 B 的后半部分。
    • 根据 midA 和 midB 的大小关系,舍弃相应的半部分序列,构成两个新的、长度减半的升序序列(注意处理序列长度为奇数或偶数的情况)。
    • 递归地对这两个新的序列执行上述步骤。
  3. 终止条件: 当序列长度缩小到 1 时,取两个序列中较小的一个作为中位数。

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 递归函数,查找两个等长升序序列的中位数
int findMedian(const vector<int>& A, int startA, int endA,
               const vector<int>& B, int startB, int endB) {
    int length = endA - startA + 1; // 序列长度

    // 基本情况:序列长度为 1
    if (length == 1) {
        return min(A[startA], B[startB]);
    }

    // 计算中位数位置
    int midAIndex = startA + (length - 1) / 2...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发