给定大小为N的数组和整数K ,任务是为每个大小为K的连续子数组找到最大值,最后打印所有这些值的总和。
例子:
Input: arr[] = {4, 10, 54, 11, 8, 7, 9}, K = 3
Output: 182
Input: arr[] = {1, 2, 3, 4, 1, 6, 7, 8, 2, 1}, K = 4
Output: 45
先决条件:
- 推拉窗技术
- 在C++ STL中设置
方法:
Set在O(logK)时间内执行插入和删除操作,并始终按排序顺序存储键。
想法是使用一组对,其中对中的第一项是元素本身,而对中的第二项包含元素的数组索引。
- 如上所述,挑选前k个元素,并使用这些元素及其索引创建一对配对。
- 现在,设置sum = 0并使用窗口滑动技术并从j = 0到n – k循环:
- 从当前窗口的集合(最后一个元素)中获取最大元素,并更新sum = sum + currMax 。
- 在集合中搜索当前窗口的最左侧元素并将其删除。
- 将当前窗口的下一个元素插入到集合中,以移至下一个窗口。
下面是上述方法的实现:
// C++ implementation of the approach
#include
using namespace std;
// Function to return the sum of maximum of
// all k size sub-arrays using set in C++ STL
int maxOfSubarrays(int arr[], int n, int k)
{
// Create a set of pairs
set > q;
// Create a reverse iterator to the set
set >::reverse_iterator it;
// Insert the first k elements along
// with their indices into the set
for (int i = 0; i < k; i++) {
q.insert(pair(arr[i], i));
}
// To store the sum
int sum = 0;
for (int j = 0; j < n - k + 1; j++) {
// Iterator to the end of the
// set since it has the maximum value
it = q.rbegin();
// Add the maximum element
// of the current window
sum += it->first;
// Delete arr[j] (Leftmost element of
// current window) from the set
q.erase(pair(arr[j], j));
// Insert next element
q.insert(pair(arr[j + k], j + k));
}
// Return the required sum
return sum;
}
// Driver Code
int main()
{
int arr[] = { 4, 10, 54, 11, 8, 7, 9 };
int K = 3;
int n = sizeof(arr) / sizeof(arr[0]);
cout << maxOfSubarrays(arr, n, K);
return 0;
}
输出:
182
时间复杂度:O(n Log n)
辅助空间:O(k)
上述问题可以在O(n)时间内解决。请参阅以下基于出队的解决方案。
最大滑动窗口(大小为k的所有子数组的最大值)
如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。