📌  相关文章
📜  使用C ++ STL中的set大小为k的所有子数组的最大值(1)

📅  最后修改于: 2023-12-03 15:36:35.357000             🧑  作者: Mango

使用C ++ STL中的set大小为k的所有子数组的最大值

在C ++中,STL(set)是一种标准库容器,它实现了一个有序且不重复的关联容器。在本文中,我们将使用set数据结构来解决找到大小为k的所有子数组的最大值的问题。

问题描述

给定一个整数数组和一个整数k,找到大小为k的所有非重叠子数组的最大值。

输入

输入包含两行。第一行包含一个整数n,表示数组的大小。第二行包含n个整数a1,a2,a3,...,an,它们是数组元素。

输出

输出包含一个整数,表示所有子数组的最大值。

示例

输入:

5
2 3 4 5 6
3

输出:

6

说明:

大小为3的所有子数组为[2,3,4],[3,4,5]和[4,5,6],它们的最大值的最大值为6。

解决方案

我们可以使用一个set来存储当前窗口中的元素,并使用双指针(即一个指向窗口的左端点,另一个指向窗口的右端点)来生成窗口。在每个步骤中,我们检查当前窗口中的元素是否为k。如果是,我们找到当前窗口中的最大值,并将其添加到输出结果中。然后,我们将左指针向右移动一位,以筛选出新的窗口。

以下是解决方案的C++代码:

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, k;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    cin >> k;

    set<int> window;
    for (int i = 0; i < k; i++)
        window.insert(nums[i]);

    int max_elem = *window.rbegin();
    cout << max_elem << endl;

    for (int i = k; i < n; i++)
    {
        window.erase(nums[i - k]);
        window.insert(nums[i]);
        max_elem = max(max_elem, *window.rbegin());
        cout << max_elem << endl;
    }

    return 0;
}

在上面的代码中,我们定义了一个set结构体,称为window。我们首先将前k个元素添加到set中。然后我们找到set中的最大值,并输出它。接下来我们移动指针并进行操作。

在每个步骤中,我们从window中删除左侧指针指向的元素,将右侧指针指向的元素添加到窗口中,并查找新的窗口最大值。我们通过使用max函数来更新max_elem变量。

最后,我们以每个步骤的结果输出max_elem变量。