给定大小为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)时间内执行插入和删除操作,并始终按排序顺序存储键。
想法是使用一组对,其中对中的第一项是元素本身,而对中的第二项包含元素的数组索引。
该程序中使用了以下方法:
- 如上所述,挑选前k个元素,并使用这些元素及其索引创建一对配对。
- 现在,使用窗口滑动技术并从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等的更多准备工作,请参阅“完整面试准备课程” 。