首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
Offer小猫🐱
中国矿业大学(北京) 产品经理
发布于北京
关注
已关注
取消关注
@林小白zii:
快手笔试 快手笔试题 0508
笔试时间:2024年05月08日 历史笔试传送门:2023秋招笔试合集 第一题 题目 给定一个长度为n的整数数组,大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,滑动窗口每次只向右移动一位。请使用一次数组遍历,输出每个滑动窗口中的最大值。 输入描述 第一行为,正整数n和正整数k,k<=n;第二行为,n个整数。 输出描述 每个滑动窗口的最大值依次输出,空格分隔。 样例输入一 100 80 209 928 234 9 390 809 34 458 826 851 929 954 228 508 87 839 756 900 461 696 916 880 293 501 770 339 188 592 75 126 245 509 526 235 634 440 246 277 579 687 595 914 873 130 335 811 818 718 78 540 367 330 742 973 29 250 834 656 725 686 451 249 683 895 172 790 180 378 715 436 522 178 370 521 698 662 167 606 198 635 27 538 840 670 829 735 932 621 910 700 348 857 319 556 591 384 942 947 523 14 样例输出一 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 973 样例输入二 100 10 534 560 153 216 972 259 908 429 809 353 735 463 898 750 814 420 337 296 71 518 795 377 407 964 407 895 747 242 170 929 779 607 281 305 168 105 22 153 742 62 617 157 199 201 573 223 918 462 972 889 644 132 970 227 888 388 499 975 752 927 382 445 861 883 133 738 467 987 145 480 95 698 735 605 395 684 389 450 211 331 306 14 428 507 423 934 505 186 526 238 289 175 307 158 157 718 468 858 949 986 样例输出二 972 972 972 972 972 908 908 898 898 898 898 898 898 814 964 964 964 964 964 964 964 964 964 964 929 929 929 929 929 929 779 742 742 742 742 742 742 918 918 972 972 972 972 972 972 972 972 972 975 975 975 975 975 975 975 975 975 975 987 987 987 987 987 987 987 987 987 987 735 735 735 735 735 684 684 684 934 934 934 934 934 934 934 934 934 934 718 718 858 949 986 参考题解 Leetcode原题,使用了单调队列(双端队列)来解决这个问题,这段代码使用了单调队列(双端队列)来解决滑动窗口的最大值问题。时间复杂度为O(n),只需要一次数组遍历。 C++:[此代码未进行大量数据的测试,仅供参考] #include <iostream>#include <vector>#include <deque>using namespace std;vector<int> maxSlidingWindow(vector<int>& nums, int k) { if (nums.empty() || k <= 0) { return {}; } int n = nums.size(); vector<int> result; deque<int> deque; for (int i = 0; i < n; i++) { // 保持窗口大小不超过k while (!deque.empty() && deque.front() < i - k + 1) { deque.pop_front(); } // 删除队列中小于当前元素的值 while (!deque.empty() && nums[deque.back()] < nums[i]) { deque.pop_back(); } // 将当前元素加入队列尾部 deque.push_back(i); // 记录窗口中的最大值 if (i >= k - 1) { result.push_back(nums[deque.front()]); } } return result;}int main() { int n, k; cin >> n >> k; vector<int> nums(n); for (int i = 0; i < n; i++) { cin >> nums[i]; } vector<int> result = maxSlidingWindow(nums, k); for (int i = 0; i < result.size(); i++) { cout << result[i]; if (i < result.size() - 1) { cout << " "; } } return 0;} Java:[此代码未进行大量数据的测试,仅供参考] import java.util.*;public class SlidingWindowMax { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 读取数组长度n和滑动窗口大小k int n = scanner.nextInt(); int k = scanner.nextInt(); // 读取整数数组 int[] nums = new int[n]; for (int i = 0; i < n; i++) { nums[i] = scanner.nextInt(); } // 输出滑动窗口的最大值 int[] result = maxSlidingWindow(nums, k); for (int i = 0; i < result.length; i++) { System.out.print(result[i]); if (i < result.length - 1) { System.out.print(" "); } } scanner.close(); } public static int[] maxSlidingWindow(int[] nums, int k) { if (nums == null || nums.length == 0 || k <= 0) { return new int[0]; } int n = nums.length; int[] result = new int[n - k + 1]; Deque<Integer> deque = new LinkedList<>(); int index = 0; for (int i = 0; i < n; i++) { // 保持窗口大小不超过k while (!deque.isEmpty() && deque.peekFirst() < i - k + 1) { deque.pollFirst(); } // 删除队列中小于当前元素的值 while (!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) { deque.pollLast(); } // 将当前元素加入队列尾部 deque.offerLast(i); // 记录窗口中的最大值 if (i >= k - 1) { result[index++] = nums[deque.peekFirst()]; } } return result; }} Python:[此代码未进行大量数据的测试,仅供参考] from collections import dequedef max_sliding_window(nums, k): if not nums or k <= 0: return [] n = len(nums) result = [] deque = deque() for i in range(n): # 保持窗口大小不超过k if deque and deque[0] < i - k + 1: deque.popleft() # 删除队列中小于当前元素的值 while deque and nums[deque[-1]] < nums[i]: deque.pop() # 将当前元素加入队列尾部 deque.append(i) # 记录窗口中的最大值
点赞 2
评论 0
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
08-12 12:10
门头沟学院 运营
oppo卡本吗
我感觉应该是看岗位,主包双非本过初筛了
投递OPPO等公司10个岗位
点赞
评论
收藏
分享
08-11 17:07
浙江海洋大学 Java
英伟达挂
也是吃上甜品了,英伟达的闭门羹
投递英伟达等公司10个岗位
点赞
评论
收藏
分享
08-05 15:59
已编辑
门头沟学院 运维工程师
想占用我双休?想都别想
隔壁组的女实习生,就之前一起吃过饭,帮她解决过几次问题
爱读书的小章鱼很爱吃:
差点有女朋友了,还好还好
点赞
评论
收藏
分享
08-12 00:23
门头沟学院 Java
晚上睡不着是有原因的
点赞
评论
收藏
分享
08-12 10:14
门头沟学院 Java
现在就挺内耗的🥲
现在一边实习,一边准备秋招简历,然而各大公司都已经开始网申海笔了,而我的简历和算法都还没准备好并且现在实习的强度也上来了,要我一周内搞定两个接口,涉及前后端,不知道这周能不能完成
一天代码十万三:
故天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,曾益其不能
实习的内耗时刻
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
总结常用的拖offer的几种话术
3.4W
2
...
26届秋招建议
1.8W
3
...
8月份面经整理的算法高频题集合
1.1W
4
...
小红书前端(已oc)
3900
5
...
字节二面-半技术半聊天?
3861
6
...
快手 秋招 一面
3861
7
...
大家离职都怎么开口的啊?
3760
8
...
8.13快手秋招Java后端二面记录
3596
9
...
小红书笔试
3307
10
...
家里人一直跟我说要给领导买点东西,搞好关系
3254
创作者周榜
更多
正在热议
更多
#
给26届的秋招建议
#
23316次浏览
671人参与
#
我的秋招“寄”录
#
32043次浏览
383人参与
#
实习的内耗时刻
#
35917次浏览
430人参与
#
独居后,你的生活是更好了还是更差了?
#
10251次浏览
159人参与
#
秋招,不懂就问
#
9096次浏览
88人参与
#
你上一次给父母打电话是什么时候
#
10574次浏览
103人参与
#
工作上你捅过哪些篓子?
#
15115次浏览
104人参与
#
你最近一次加班是什么时候?
#
76103次浏览
414人参与
#
规定下班时间vs实际下班时间
#
17368次浏览
133人参与
#
我的AI电子员工
#
11958次浏览
95人参与
#
在职场上,你最讨厌什么样的同事
#
22850次浏览
192人参与
#
如果校招重来我最想改变的是
#
277601次浏览
2886人参与
#
查收我的offer竞争力报告
#
195453次浏览
1290人参与
#
vivo求职进展汇总
#
220979次浏览
1367人参与
#
秋招想进国企该如何准备
#
82174次浏览
446人参与
#
大城市找工作会更容易吗
#
44260次浏览
352人参与
#
你觉得找工作该拿大厂还是小厂练手
#
200628次浏览
1761人参与
#
CVTE求职进展汇总
#
18027次浏览
296人参与
#
得物求职进展汇总
#
104117次浏览
836人参与
#
听劝,这个公司值得去吗
#
504737次浏览
1714人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务