Java相关
static与final关键字
何时加载
保存在哪里
数据库相关
二叉树与B树
操作系统
进程与线程
进程与线程的差别
线程为什么轻量级
计算机网络
TCP建立连接三次握手
基本流程
第二次握手的意义
TCP为何要建立连接
算法题
滑动窗口最大值
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。
输入: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 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7
public int[] maxSlidingWindow(int[] nums, int k) {if(nums.length == 0 || k == 0) {return new int[0];}// 双端队列,较大的元素总在队头Deque<Integer> deque = new LinkedList<>();int l = nums.length;int[] res = new int[l - k + 1];int idx = 0;for (int i = 0; i < l; i++) {// 队列从后往前,比当前访问元素小的都不会为最大值,都删除while (!deque.isEmpty() && deque.peekLast() < nums[i]) {deque.pollLast();}// 新加入较大的元素放在队列尾部,因为他们在滑动窗口的靠后位置deque.offerLast(nums[i]);// 满足形成窗口,开始产生结果if (i >= k - 1) {res[idx++] = deque.peekFirst();// 队头元素已经是滑动窗口中最前元素,下次循环会从窗口中移出,直接从队列删除if (deque.peekFirst() == nums[i - k + 1]) {deque.pollFirst();}}}return res;}
