📅  最后修改于: 2023-12-03 15:36:35.357000             🧑  作者: Mango
在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变量。