📜  使用C ++ STL中的set打印所有子数组的最小值

📅  最后修改于: 2021-05-31 22:16:25             🧑  作者: Mango

给定大小为N的数组和整数K,请找到大小为K的每个连续子数组的最小值。

例子

Input : arr[] = {5, 3, 4, 1, 1}, K = 3
Output : 3 1 1

Input : arr[] = {1, 2, 3, 4, 1, 6, 7, 8, 2, 1}, K = 4
Output : 1 1 1 1 1 2 1

先决条件

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

Set在o(logK)时间内执行插入和删除操作,并始终按排序顺序存储键。

想法是使用一组对,其中对中的第一项是元素本身,而对中的第二项包含元素的数组索引。

该程序中使用了以下方法:

  1. 如上所述,挑选前k个元素,并使用这些元素及其索引创建一对配对。
  2. 现在,使用窗口滑动技术并从j = 0循环到nk:
    • 从当前窗口中的集合中获取最小元素并进行打印。(第一个元素)
    • 在集合中搜索当前窗口的最左侧元素并将其删除。
    • 将当前窗口的下一个元素插入到集合中,以移至下一个窗口。

为什么我们使用一组对而不是一组?

集合不允许插入重复元素,并且大小为k的窗口可以具有任意数量的重复元素。因此,我们将一对元素及其索引插入到集合中。

下面是上述方法的实现:

// CPP program to pint Minimum of
// all Subarrays using set in C++ STL
  
#include 
using namespace std;
  
// Function to pint Minimum of
// all Subarrays using set in C++ STL
void minOfSubarrays(int arr[], int n, int k)
{
    // Create a set of pairs
    set > q;
  
    // Create an iterator to the set
    set >::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));
    }
  
    for (int j = 0; j < n - k + 1; j++) {
  
        // Iterator to the beginning of the
        // set since it has the minimum value
        it = q.begin();
  
        // Print the minimum element
        // of current window
        cout << 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));
    }
}
  
// Driver Code
int main()
{
    int arr[] = { 5, 3, 4, 1, 1 };
  
    int K = 3;
  
    int n = sizeof(arr) / sizeof(arr[0]);
  
    minOfSubarrays(arr, n, K);
  
    return 0;
}
输出:
3 1 1

时间复杂度:O(N * LogK)

想要从精选的最佳视频中学习并解决问题,请查看有关从基础到高级C++的C++基础课程以及有关语言和STL的C++ STL课程。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”