首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
彭三岁
字节跳动_服务端开发
发布于北京
关注
已关注
取消关注
@牛客题解官:
滑动窗口的最大值
描述 这是一篇针对初学者的题解。共用两种方法解决。从暴力算法一步步到最优算法。知识点:数组,队列难度:二星 题解 题目描述:给定一个数组num和一个窗口大小size,求每个窗口的最大值。 方法一:暴力方法 根据题目描述,我们很容易想到暴力方法。并且也很轻松的就可以写出来。如果数组的大小是n,窗口的大小是size,那么窗口的数量就是 n - size + 1.算法步骤如下: 枚举每个窗口的左边界 i 根据窗口的左边界i可以对应计算出右边界j 遍历窗口,计算出最大值 代码如下: class Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> ret; if (num.size() == 0 || size < 1 || num.size() < size) return ret; int n = num.size(); for (int i = 0; i + size - 1 < n; ++i) { int j = i + size - 1; int max_val = num[j]; for (int k = i; k < j; ++k) { max_val = max(max_val, num[k]); } ret.push_back(max_val); } return ret; }};时间复杂度:O(n*k), 其中n为数组大小,k为窗口大小空间复杂度:O(1),存结果必须要开的数组不算入额外空间 方法二:单调队列 方法一种存在很多大量重复计算,比如说,对于数组,假设我们当前遍历到下标i,对于下标i+1的元素(假设i和i+1都在同一个窗口),如果比arr[i]大,说明了什么?如果arr[i+1] 已经大于了 arr[i], 那么还要arr[i]有什么用.就有点“既生瑜何生亮”的感觉。如果arr[i+1] < arr[i]呢?显然arr[i]还是需要保留的。为什么呢?因为又可以arr[i] 对于下一个arr[i+1]所在的窗口来说,arr[i]已经失效了。 假设这里有那么一个容器可以保留上述操作。 遍历数组的每一个元素, 如果容器为空,则直接将当前元素加入到容器中。 如果容器不为空,则让当前元素和容器的最后一个元素比较,如果大于,则将容器的最后一个元素删除,然后继续讲当前元素和容器的最后一个元素比较 如果当前元素小于容器的最后一个元素,则直接将当前元素加入到容器的末尾 如果容器头部的元素已经不属于当前窗口的边界,则应该将头部元素删除 总结一下,首先容器中放的元素应该是单调递减的。然后还有删除容器头部元素和最后一个元素的操作。因此,这样的数据结构就是双端队列。c++中就是deque 如何判断队列中头部的元素是否过期呢?这里我们可以存数组的下标,根据下标的比较来判断。比如,当前遍历到下标为5的元素,窗口的大小为3, 显然显然下标为2的已经过期了。 代码如下: class Solution {public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> ret; if (num.size() == 0 || size < 1 || num.size() < size) return ret; int n = num.size(); deque<int> dq; for (int i = 0; i < n; ++i) { while (!dq.empty() && num[dq.back()] < num[i]) { dq.pop_back(); } dq.push_back(i); // 判断队列的头部的下标是否过期 if (dq.front() + size <= i) { dq.pop_front(); } // 判断是否形成了窗口 if (i + 1 >= size) { ret.push_back(num[dq.front()]); } } return ret; }};时间复杂度:O(n), 其中n为数组大小空间复杂度:O(k),k为窗口的大小
点赞 102
评论 8
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-31 18:45
内蒙古财经大学 C++
想找暑期实习,求大佬提点意见
我的求职思考
点赞
评论
收藏
分享
03-26 18:33
中国传媒大学 数据分析师
你的实习产出是真实的还是包装的?
现在找工作卷成这样,很多人简历上的实习经历看着特别厉害,又是独立负责项目,又是数据显著提升,又是产出重要成果。可真要细问几句,流程说不清楚,细节对不上号,逻辑也稀碎。 其实包装一点可以理解,但别把自己都骗了。真正有用的实习,是你真的参与、真的思考、真的解决过问题。全靠编出来的漂亮产出,面试一戳就破,入职之后也扛不住活。与其花心思美化简历,不如踏踏实实做点能拿得出手的东西,心里有底,说话才硬气。#你的实习产出是真实的还是包装的?#
点赞
评论
收藏
分享
02-14 12:41
山西大学 测试工程师
程序员是真的要早读吗
KKorz:
是这样的,还会定期默写抽查
点赞
评论
收藏
分享
03-01 00:07
浙江大学 Java
9本啥也不会求简历建议
各位前辈好 浙大本科,0实习0科研0绩点,唯一优势可能学校大作业做的比较扎实(但没啥用)。留学实习两手抓,现在开始学开发还来得及在暑假找到实习吗?以及简历上需不需要放一个魔改的项目呢?简历目前是ai做的,求建议拷打。
_wowowo_:
项目是重点
你可以尝试自己对着自己的简历问问题,觉得哪些可以突出一下,没用的最好直接删了
当然浙本✌面试肯定随便进
点赞
评论
收藏
分享
03-26 19:08
中国矿业大学 后端工程师
3.26字节财经一面
1 synchronized底层原理 2.voliate 为什么不能保证原子性 3.threelocal内存泄漏的原因 4.mysql为什么用b+树 5.事务隔离级别有哪些主要解决什么问题 6.mvcc原理 7.对ai的理解 8 skill作用 9 mcp是什么样的协议 10.怎么开发一个mcp服务 11上下文过大怎么解决 12.leetcode438. 找到字符串中所有字母异位词
查看12道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
我放弃互联网大厂了。。
3433
2
...
Vibe Coding开发前的 7 个关键步骤
3169
3
...
字节实习一、二、三、HR面面经
2884
4
...
双非前端字节一面面经(难度 plus ultra 版)
2561
5
...
我招了!当年就是被招行这么招进去的
1730
6
...
京东零售平台产品与研发中心一面
1529
7
...
如何把面试主动权握在手里?Ai岗面试焚诀!
1429
8
...
美团后端暑期实习一面
1354
9
...
美团暑期二面
1345
10
...
在工作中,如何正确使用vibe coding来增效?
1345
创作者周榜
更多
正在热议
更多
#
你觉得大几开始实习最合适?
#
9646次浏览
94人参与
#
实习生的蛐蛐区
#
921489次浏览
4698人参与
#
开放七大实习专项,百度暑期实习值得冲吗
#
28904次浏览
530人参与
#
你见过哪些招聘隐形歧视?
#
6744次浏览
67人参与
#
毕业季等于分手季吗
#
59293次浏览
680人参与
#
面试被问到不会的问题,你怎么应对?
#
8791次浏览
71人参与
#
招商银行数字金融训练营
#
69006次浏览
788人参与
#
面试吐槽bot
#
182216次浏览
865人参与
#
好好告别我的学生时代
#
138169次浏览
1554人参与
#
25届秋招公司红黑榜
#
328775次浏览
1292人参与
#
小厂实习有必要去吗
#
87352次浏览
417人参与
#
租房前辈的忠告
#
380364次浏览
7491人参与
#
你都用vibe coding做过什么?
#
4061次浏览
164人参与
#
做完笔试后你收到面试了吗?
#
9505次浏览
82人参与
#
Vibe Coding 会干掉初级岗位吗?
#
7919次浏览
131人参与
#
实习转正进行时
#
168443次浏览
1064人参与
#
AI Coding实战技巧
#
2925次浏览
77人参与
#
你现在一天AI几次?
#
2970次浏览
60人参与
#
牛友の3月总结
#
13218次浏览
122人参与
#
如果人生可以debug你会改哪一行?
#
3542次浏览
75人参与
#
大厂实习和小厂实习最大的区别是什么?
#
17649次浏览
113人参与
#
百度工作体验
#
319725次浏览
2239人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务