邢台网站建设厂家网站开发找哪家
web/
2025/9/26 17:32:51/
文章来源:
邢台网站建设厂家,网站开发找哪家,html写手机网站,网站的第二域名怎么用题目描述
给你一个整数数组 nums#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1#xff1a;
输入#xff1a;nums [1,3,-1,-3,5,3,6,…题目描述
给你一个整数数组 nums有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
示例 1
输入nums [1,3,-1,-3,5,3,6,7], k 3
输出[3,3,5,5,6,7]
解释
滑动窗口的位置 最大值
--------------- -----
[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6 7 51 3 -1 -3 [5 3 6] 7 61 3 -1 -3 5 [3 6 7] 7示例 2
输入nums [1], k 1
输出[1]提示
1 nums.length 105-104 nums[i] 1041 k nums.length
思路
首先最好想的是暴力解决但是暴力方法的时间复杂度是O(n * k)当n或者k增加乘积将会非常大非常容易TLE。不妨换一种方法我们使用一个队列这个队列比较特殊在队首的是这个区间内的最大值有了这个队列这个题就会非常好解决但是STL中没有这样的队列我们只能手搓一下这个队列。手搓之前我们先来构思一下
这个类需要有队列的基本功能pop出来的时候只有当参数等于队列前元素时弹出队列前元素push进去的时候当参数大于队尾时pop队尾所有元素该元素push队列保证队尾元素是即将最大的元素front函数就很简单了调用就告诉你这个区间的最大值
基于上面的美好愿景我们使用deque来实现也就是我们的这个队列是基于deque魔改
dequeint que;deque是一个双向队列
下面是这个类的源码
class MyQueue {public:dequeint que;// 函数说明当参数等于队列前元素时弹出队列前元素void pop(int value) {if (!que.empty() value que.front()) {que.pop_front();}}// 函数说明当参数大于队尾时pop队尾所有元素该元素push队列保证队尾元素是即将最大的元素void push(int value) {while (!que.empty() value que.back()) {que.pop_back();}que.push_back(value);}// 函数说明获得当前窗口的最大元素int front() {return que.front();}
};主函数源码
public:vectorint maxSlidingWindow(vectorint nums, int k) {MyQueue que;vectorint res;// 先放入前k个元素for (int i 0; i k; i) {que.push(nums[i]);}res.push_back(que.front());for (int i k; i nums.size(); i) {que.pop(nums[i-k]);que.push(nums[i]);res.push_back(que.front());}return res;}
};口头来描述一下主函数的过程我们说我们现在实现的函数是调用front函数就会告诉你窗口最大值那么怎么判断这个队首元素该弹出了呢我们可以来滑动窗口当窗口末尾的元素和这个队列的首项相同时弹出那么队列的队首就会变为下一个元素我们称这个元素是即将要变为最大的元素那么这个元素怎么来的呢也是通过滑动窗口时进来的元素和队尾打擂台比他大队尾就走赢家就进入通过这样我们就可以保持队尾的元素也就是即将变大的元素总是最大的名副其实
程序源码
class Solution {
private:class MyQueue {public:dequeint que;// 函数说明当参数等于队列前元素时弹出队列前元素void pop(int value) {if (!que.empty() value que.front()) {que.pop_front();}}// 函数说明当参数大于队尾时pop队尾所有元素该元素push队列保证队尾元素是即将最大的元素void push(int value) {while (!que.empty() value que.back()) {que.pop_back();}que.push_back(value);}// 函数说明获得当前窗口的最大元素int front() {return que.front();}};
public:vectorint maxSlidingWindow(vectorint nums, int k) {MyQueue que;vectorint res;// 先放入前k个元素for (int i 0; i k; i) {que.push(nums[i]);}res.push_back(que.front());for (int i k; i nums.size(); i) {que.pop(nums[i-k]);que.push(nums[i]);res.push_back(que.front());}return res;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82303.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!