可以使用滑动窗口来解决此问题。

首先,从左到右遍历数组'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)。

C++ 算法:使用静态数组求解区间最小值最大问题

原文地址: https://www.cveoy.top/t/topic/qwl4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录