#3704. 找最大值

找最大值

题目要求很简单,让你去找一个长度为 nn 的序列的最大值。

但是这次不再是让你自己写代码,而是按照给定代码的思路,将代码补全。

提示:该代码使用了分治法,每次将序列 尽可能平分 成两部分,先对每部分求最大值,然后将两个最大值的最大值返回为答案。

按照题目要求,尝试思考一下:

  1. 分治过程中有几个子问题?
  2. 每个子问题分别是什么?
  3. 分治边界又是什么?

然后再做选择。

int Max(int a[], int l, int r) { // 对给定数组 a,求解下标 l 到 r 之间的元素的最大值
    if (①) {
        return a[l];
    }
    int mid = (l + r) >> 1;
    int k1 = Max(a, l, ②);
    int k2 = Max(a, mid + 1, ③)
    return max(k1, k2);
}

① 处应填 {{ select(1) }}

  • l == r
  • a[l] > a[r]
  • a[l] >= a[r]
  • a[l] > Max(a, l + 1, r)

② 处应填 {{ select(2) }}

  • a[mid]
  • mid + 1
  • mid - 1
  • mid

③ 处应填 {{ select(3) }}

  • r
  • a[r]
  • r - 1
  • a[r - 1]