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

📅  最后修改于: 2021-06-26 10:29:52             🧑  作者: Mango

给定大小为N的数组和整数K ,任务是为每个大小为K的连续子数组找到最大值,最后打印所有这些值的总和。

例子:

先决条件

  • 推拉窗技术
  • 在C++ STL中设置

方法:
Set在O(logK)时间内执行插入和删除操作,并始终按排序顺序存储键。
想法是使用一组对,其中对中的第一项是元素本身,而对中的第二项包含元素的数组索引。

  1. 如上所述,挑选前k个元素,并使用这些元素及其索引创建一对配对。
  2. 现在,设置sum = 0并使用窗口滑动技术并从j = 0n – 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现场课程美国》。