#3704. 找最大值
找最大值
题目要求很简单,让你去找一个长度为 的序列的最大值。
但是这次不再是让你自己写代码,而是按照给定代码的思路,将代码补全。
提示:该代码使用了分治法,每次将序列 尽可能平分 成两部分,先对每部分求最大值,然后将两个最大值的最大值返回为答案。
按照题目要求,尝试思考一下:
- 分治过程中有几个子问题?
- 每个子问题分别是什么?
- 分治边界又是什么?
然后再做选择。
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]