C++ 算法:使用静态数组求解区间最小值最大问题
可以使用滑动窗口来解决此问题。
首先,从左到右遍历数组'a',记录当前窗口的最小值,并将这个最小值放入一个辅助数组'minVal[]'中。'minVal[i]'表示以'a[i]'为右端点的长度为'm'的子区间的最小值。
然后,从右到左遍历'minVal[]'数组,记录当前窗口的最大值,并将这个最大值放入一个辅助数组'maxVal[]'中。'maxVal[i]'表示以'a[i]'为左端点的长度为'm'的子区间的最大值。
最后,遍历'maxVal[]'数组,找到最小的最大值,即为所求的结果。
以下是使用 C++ 实现的代码:
#include <iostream>
using namespace std;
const int MAXN = 100000;
int main() {
int n, m;
int a[MAXN], minVal[MAXN], maxVal[MAXN];
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// 计算minVal[]
int minIdx = 0;
for (int i = 0; i < m; i++) {
while (minIdx < i && a[i] <= a[minVal[minIdx]]) {
minIdx++;
}
minVal[i] = i;
}
for (int i = m; i < n; i++) {
while (minIdx < i && a[i] <= a[minVal[minIdx]]) {
minIdx++;
}
minVal[i] = minVal[minIdx];
}
// 计算maxVal[]
int maxIdx = n - 1;
for (int i = n - 1; i >= n - m; i--) {
while (maxIdx > i && a[i] >= a[maxVal[maxIdx]]) {
maxIdx--;
}
maxVal[i] = i;
}
for (int i = n - m - 1; i >= 0; i--) {
while (maxIdx > i && a[i] >= a[maxVal[maxIdx]]) {
maxIdx--;
}
maxVal[i] = maxVal[maxIdx];
}
// 找到最小的最大值
int ans = a[maxVal[0]];
for (int i = 1; i <= n - m; i++) {
ans = min(ans, a[maxVal[i]]);
}
cout << ans << endl;
return 0;
}
该算法的时间复杂度为 O(n),空间复杂度为 O(n)。
原文地址: https://www.cveoy.top/t/topic/qwl4 著作权归作者所有。请勿转载和采集!