滑动窗口最大值 发表于 2022-05-01 | 分类于 算法 , 优先队列 , 滑动窗口最大值 | 滑动窗口最大值 239.滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 12345678910111213141516171819202122232425class Solution {public: vector<int> maxSlidingWindow(vector<int>& nums, int k) { int n=nums.size(); //优先队列中存储二元组(nums[i], i); priority_queue<pair<int,int>> pq; //初始将前k个元素放入到优先队列中 for(int i=0;i<k;i++){ pq.emplace(nums[i], i); } //存放最终结果 vector<int> res={pq.top().first}; //开始移动窗口 for(int i=k;i<n;i++){ //将下一个元素加入 pq.emplace(nums[i], i); //当堆顶元素为滑动窗口最左侧的值,移出堆顶元素 while(pq.top().second <= i-k){ pq.pop(); } res.push_back(pq.top().first); } return res; }}; 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162import "container/heap"// 定义优先队列元素type Item struct { value int // 元素值 index int // 元素索引}// 定义优先队列type PriorityQueue []*Itemfunc (pq PriorityQueue) Len() int { return len(pq) }func (pq PriorityQueue) Less(i, j int) bool { // 最大堆,值大的优先级高 return pq[i].value > pq[j].value}func (pq PriorityQueue) Swap(i, j int) { pq[i], pq[j] = pq[j], pq[i]}func (pq *PriorityQueue) Push(x interface{}) { item := x.(*Item) *pq = append(*pq, item)}func (pq *PriorityQueue) Pop() interface{} { old := *pq n := len(old) item := old[n-1] *pq = old[0 : n-1] return item}func maxSlidingWindow(nums []int, k int) []int { n := len(nums) // 优先队列中存储二元组(nums[i], i) pq := &PriorityQueue{} heap.Init(pq) // 初始将前k个元素放入到优先队列中 for i := 0; i < k; i++ { heap.Push(pq, &Item{value: nums[i], index: i}) } // 存放最终结果 res := []int{(*pq)[0].value} // 开始移动窗口 for i := k; i < n; i++ { // 将下一个元素加入 heap.Push(pq, &Item{value: nums[i], index: i}) // 当堆顶元素为滑动窗口最左侧的值,移出堆顶元素 for (*pq)[0].index <= i-k { heap.Pop(pq) } res = append(res, (*pq)[0].value) } return res} -------------本文结束 感谢阅读------------- 本文作者: HReina 本文链接: http://hreina.com/2022/05/01/%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC/ 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!