Java相关

staticfinal关键字

何时加载

保存在哪里

数据库相关

二叉树与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

  1. public int[] maxSlidingWindow(int[] nums, int k) {
  2. if(nums.length == 0 || k == 0) {
  3. return new int[0];
  4. }
  5. // 双端队列,较大的元素总在队头
  6. Deque<Integer> deque = new LinkedList<>();
  7. int l = nums.length;
  8. int[] res = new int[l - k + 1];
  9. int idx = 0;
  10. for (int i = 0; i < l; i++) {
  11. // 队列从后往前,比当前访问元素小的都不会为最大值,都删除
  12. while (!deque.isEmpty() && deque.peekLast() < nums[i]) {
  13. deque.pollLast();
  14. }
  15. // 新加入较大的元素放在队列尾部,因为他们在滑动窗口的靠后位置
  16. deque.offerLast(nums[i]);
  17. // 满足形成窗口,开始产生结果
  18. if (i >= k - 1) {
  19. res[idx++] = deque.peekFirst();
  20. // 队头元素已经是滑动窗口中最前元素,下次循环会从窗口中移出,直接从队列删除
  21. if (deque.peekFirst() == nums[i - k + 1]) {
  22. deque.pollFirst();
  23. }
  24. }
  25. }
  26. return res;
  27. }