CareerCup Maximum of all subarrays of size k (Added a O(n) method)
2014-02-23 23:39
369 查看
Given an array and an integer k, find the maximum for each and every contiguous subarray of size k.
Examples:
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
--------------------------------------------------------------------------------------------------
Method 2 (Use Self-Balancing BST)
1) Pick first k elements and create a Self-Balancing Binary Search Tree (BST) of size k.
2) Run a loop for i = 0 to n – k
…..a) Get the maximum element from the BST, and print it.
…..b) Search for arr[i] in the BST and delete it from the BST.
…..c) Insert arr[i+k] into the BST.
Time Complexity: Time Complexity of step 1 is O(kLogk). Time Complexity of steps 2(a), 2(b) and 2(c) is O(Logk). Since steps 2(a), 2(b) and 2(c) are in a loop that runs n-k+1 times, time complexity of the complete algorithm is O(kLogk + (n-k+1)*Logk) which
can also be written as O(nLogk).
Method 3 (A O(n) method: use Dequeue)
We create a Dequeue, Qi of capacity k, that stores only useful elements of current window of k elements.
An element is useful if it is in current window and is greater than all other elements on left side of it in current window. We process all array elements one by one and maintain Qi to contain useful elements of current window and these useful elements
are maintained in sorted order. The element at front of the Qi is the largest and element at rear of Qi is the smallest of current window. Thanks to Aashish for
suggesting this method.
Following is C++ implementation of this method.
Output:
Time Complexity: O(n). It seems more than O(n) at first look. If we take a closer look, we can observe that every element of array is added and removed at most once. So there are total 2n operations.
Auxiliary Space: O(k)
Please write comments if you find the above codes/algorithms incorrect, or find other ways to solve the same problem.
Examples:
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
--------------------------------------------------------------------------------------------------
Method 2 (Use Self-Balancing BST)
1) Pick first k elements and create a Self-Balancing Binary Search Tree (BST) of size k.
2) Run a loop for i = 0 to n – k
…..a) Get the maximum element from the BST, and print it.
…..b) Search for arr[i] in the BST and delete it from the BST.
…..c) Insert arr[i+k] into the BST.
Time Complexity: Time Complexity of step 1 is O(kLogk). Time Complexity of steps 2(a), 2(b) and 2(c) is O(Logk). Since steps 2(a), 2(b) and 2(c) are in a loop that runs n-k+1 times, time complexity of the complete algorithm is O(kLogk + (n-k+1)*Logk) which
can also be written as O(nLogk).
Method 3 (A O(n) method: use Dequeue)
We create a Dequeue, Qi of capacity k, that stores only useful elements of current window of k elements.
An element is useful if it is in current window and is greater than all other elements on left side of it in current window. We process all array elements one by one and maintain Qi to contain useful elements of current window and these useful elements
are maintained in sorted order. The element at front of the Qi is the largest and element at rear of Qi is the smallest of current window. Thanks to Aashish for
suggesting this method.
Following is C++ implementation of this method.
#include <iostream> #include <deque> usingnamespace std; // A Dequeue (Double ended queue) based method for printing maixmum element of // all subarrays of size k voidprintKMax(intarr[], intn, intk) { // 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 */ inti; 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 functions intmain() { intarr[] = {12, 1, 78, 90, 57, 89, 56}; intn = sizeof(arr)/sizeof(arr[0]); intk = 3; printKMax(arr, n, k); return0; }
Output:
78 90 90 90 89
Time Complexity: O(n). It seems more than O(n) at first look. If we take a closer look, we can observe that every element of array is added and removed at most once. So there are total 2n operations.
Auxiliary Space: O(k)
Please write comments if you find the above codes/algorithms incorrect, or find other ways to solve the same problem.
相关文章推荐
- 所有子序列的最大值 Maximum of all subarrays of size k
- Data Structure Array: Maximum of all subarrays of size k
- CareerCup Output the amount of all possible strings of length N that don't of have consecutive a,b,c
- CareerCup Eliminate all ‘b’ and ‘ac’ in an array of characters
- CareerCup Fill the array with product of all numbers except the number in that cell
- CareerCup the maximum longest continous sequence of 0s
- CareerCup Binary Tree the Maximum of 人
- CareerCup Find all the conflicting appointments from a given list of n appointments.
- .\ethercat.axf: error: L6047U: The size of this image (33488 bytes) exceeds the maximum allowed for
- Q9.4 Write a method that returns all subsets of a set.
- CareerCup Find the biggest interval that has all its members in list in O(n)
- CareerCup Find the diameter of the tree
- CareerCup Given a binary matrix of N X N of integers , you need to return only unique rows of binary
- here was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache
- tomcat consider increasing the maximum size of the cache java.lang.IncompatibleClassChangeError: Imp
- [转]Spring Boot修改最大上传文件限制:The field file exceeds its maximum permitted size of 1048576 bytes.
- Spring Boot 批量上传: The field files exceeds its maximum permitted size of 1048576 bytes.
- Q9.5 Write a method to compute all permutations of a string
- Maximum size square sub-matrix with all 1s
- CareerCup Fermat point of a traingle