📌  相关文章
📜  使用Map,大小为K的所有子数组的最小值和最大值

📅  最后修改于: 2021-05-17 17:47:18             🧑  作者: Mango

给定N个整数和整数K的数组arr [] ,任务是找到大小为K的所有子数组的最小和最大值。

例子:

方法:

  1. 遍历给定的数组直到K个元素,并将每个元素的计数存储到映射中。
  2. 插入K个元素后,对其余每个元素执行以下操作:
    • 将当前元素arr [i]的频率增加1。
    • arr [i – K + 1]的频率减少1以存储大小为K的当前子数组(arr [i – K + 1,i] )的频率。
    • 由于map按排序顺序存储键值对。因此,迭代器在地图的开头存储最小的元素,而在地图的结尾存储最大的元素。打印当前子数组的最小和最大元素。
  3. 对形成的每个子阵列重复上述步骤。

下面是上述方法的实现:

// C++ program for the above approach
  
#include 
using namespace std;
  
// Function to find the minimum and
// maximum element for each subarray
// of size K
int maxSubarray(int arr[], int n, int k)
{
  
    // To store the frequency of element
    // for every subarray
    map Map;
  
    // To count the subarray array size
    // while traversing array
    int l = 0;
  
    // Traverse the array
    for (int i = 0; i < n; i++) {
  
        // Increment till we store the
        // frequency of first K element
        l++;
  
        // Update the count for current
        // element
        Map[arr[i]]++;
  
        // If subarray size is K, then
        // find the minimum and maximum
        // for each subarray
        if (l == k) {
  
            // Iterator points to end
            // of the Map
            auto itMax = Map.end();
            itMax--;
  
            // Iterator points to start of
            // the Map
            auto itMin = Map.begin();
  
            // Print the minimum and maximum
            // element of current sub-array
            cout << itMin->first << ' '
                 << itMax->first << endl;
  
            // Decrement the frequency of
            // arr[i - K + 1]
            Map[arr[i - k + 1]]--;
  
            // if arr[i - K + 1] is zero
            // remove from the map
            if (Map[arr[i - k + 1]] == 0) {
                Map.erase(arr[i - k + 1]);
            }
  
            l--;
        }
    }
    return 0;
}
  
// Driver Code
int main()
{
    // Given array arr[]
    int arr[] = { 5, 4, 3, 2, 1, 6,
                  3, 5, 4, 2, 1 };
  
    // Subarray size
    int k = 3;
  
    int n = sizeof(arr) / sizeof(arr[0]);
  
    // Function Call
    maxSubarray(arr, n, k);
    return 0;
}
输出:
3 5
2 4
1 3
1 6
1 6
3 6
3 5
2 5
1 4

时间复杂度: O(N * log K) ,其中N是元素数。
辅助空间: O(K) ,其中K是子数组的大小。