所有子序列的最大值 Maximum of all subarrays of size k

来源:互联网 发布:mac 退出编辑模式 编辑:程序博客网 时间:2024/05/21 17:22

给定一个数组和一个整数k,找到每一个长度为k的子序列的最大值。例如:

Input :
arr[] = {1, 2, 3, 1, 4, 5, 2, 3, 6}
k = 3
Output :
3 3 4 5 5 5 6

Input :
arr[] = {8, 5, 10, 7, 9, 4, 15, 12, 90, 13}
k = 4
Output :
10 10 10 15 15 90 90

#include <iostream>#include <deque> using namespace std; // A Dequeue (Double ended queue) based method for printing maixmum element of// all subarrays of size kvoid printKMax(int arr[], int n, int k){    // Create a Double Ended Queue, Qi that will store indexes of array elements    // The queue will store indexes of useful elements in every window and it will    // maintain decreasing order of values from front to rear in Qi, i.e.,     // arr[Qi.front[]] to arr[Qi.rear()] are sorted in decreasing order    std::deque<int>  Qi(k);     /* Process first k (or first window) elements of array */    int i;    for (i = 0; i < k; ++i)    {        // For very element, the previous smaller elements are useless so        // remove them from Qi        while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])            Qi.pop_back();  // Remove from rear         // Add new element at rear of queue        Qi.push_back(i);    }     // Process rest of the elements, i.e., from arr[k] to arr[n-1]    for ( ; i < n; ++i)    {        // The element at the front of the queue is the largest element of        // previous window, so print it        cout << arr[Qi.front()] << " ";         // Remove the elements which are out of this window        while ( (!Qi.empty()) && Qi.front() <= i - k)            Qi.pop_front();  // Remove from front of queue         // Remove all elements smaller than the currently        // being added element (remove useless elements)        while ( (!Qi.empty()) && arr[i] >= arr[Qi.back()])            Qi.pop_back();          // Add current element at the rear of Qi        Qi.push_back(i);    }     // Print the maximum element of last window    cout << arr[Qi.front()];} // Driver program to test above functionsint main(){    int arr[] = {12, 1, 78, 90, 57, 89, 56};    int n = sizeof(arr)/sizeof(arr[0]);    int k = 3;    printKMax(arr, n, k);    return 0;}

Time Complexity: O(n).

上面代码的第37行用了while loop循环,但是貌似把37行代码去掉就行了。以后仔细研究一下到底行不行?

相关问题:

子序列的最大几个值

You have been given large stream of m size and you have size of n window . you have to find the k minimum in each window . we are shifting the window by one at every iteration.
sol: I have used self balancing tree.First i have entered n element in tree and do in order traversal upto k to find k minimum element.Now shift the window by one .Now we to remove first element(logn time req) and insert the new element(logn time).


0 0
原创粉丝点击