ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【字串】【困难】滑动窗口最大值

2026/8/13 12:07:27 拓冰建站 浏览量
【字串】【困难】滑动窗口最大值 题目给你一个整数数组 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 731 [3 -1 -3] 5 3 6 731 3 [-1 -3 5] 3 6 751 3 -1 [-3 5 3] 6 751 3 -1 -3 [5 3 6] 761 3 -1 -3 5 [3 6 7]7示例 2输入nums [1], k 1输出[1]提示1 nums.length 10^5-10^4 nums[i] 10^41 k nums.length方法一暴力求解每次比较k个元素的最大值timeoutpublicstaticint[]maxSlidingWindow(int[]nums,intk){int[]ansnewint[nums.length-k1];intmaxnums[0];for(inti0;ians.length;i){//k个元素的最大值maxnums[i];for(intji1;jik;j){maxMath.max(max,nums[j]);}ans[i]max;}returnans;}方法二单调队列维护一个从大到小排列的队列队头永远最大。每当新来的数字时会把前面比它小的数字全部淘汰。publicstaticint[]maxSlidingWindow(int[]nums,intk){DequeIntegerdequenewArrayDeque();int[]ansnewint[nums.length-k1];for(inti0;inums.length;i){//超过窗口删除元素if(!deque.isEmpty()deque.peekFirst()i-k){//删除头元素deque.pollFirst();}//从后到前依次比较删除比当前值小的元素while(!deque.isEmpty()nums[i]nums[deque.peekLast()]){deque.pollLast();}deque.addLast(i);//进入数组if(ik-1){ans[i-k1]nums[deque.peekFirst()];}}returnans;}