所有子序列的最大值 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).
- 所有子序列的最大值 Maximum of all subarrays of size k
- CareerCup Maximum of all subarrays of size k (Added a O(n) method)
- Maximum Sum of 3 Non-Overlapping Subarrays
- Maximum size of malloc()
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- LWC 52:689. Maximum Sum of 3 Non-Overlapping Subarrays
- LeetCode689. Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- [leetcode]Maximum Sum of 3 Non-Overlapping Subarrays
- [LeetCode] DP 之 Maximum sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- 689. Maximum Sum of 3 Non-Overlapping Subarrays
- LeetCode|Substring with Concatenation of All Words(所有单词的串联的子字符串)
- LeetCode | Substring with Concatenation of All Words(链接所有单词的子串)
- Substring with Concatenation of All Words字符串中找到包含所有单词的子串
- FileSizeLimitExceededException的maximum permitted size of 1048576 bytes问题
- hdoj 5496 Beauty of Sequence 【求序列所有子序列(去重后)的和】【好题】
- LeetCode 325. Maximum Size Subarray Sum Equals k(和为k的最长子数组)
- cheap personalized jerseys
- wholesale nike jerseys paypal
- 高科技购房计划幅度很大符合梵蒂冈
- 防火规范很多符合梵蒂冈电饭锅地方
- 风格积谷防饥购房计划规范化
- 所有子序列的最大值 Maximum of all subarrays of size k
- 学习笔记
- 这下安全了!微软开始部署保安机器人
- 谷歌的新玩意儿 实时翻译型虚拟键盘
- 思科ucs构建面向云的虚拟化数据中心
- 每日软件新闻汇总:微软多个服务平台遭遇宕机
- 玄讯荣获“2014中国信息化成果·移动CRM领域最佳..
- 国家教育信息化产业技术创新战略联盟成立
- 为什么欧盟会想着分拆Google?