• leetcode top100(11)滑动窗口最大值


    /**
     * 给你一个整数数组 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 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. package TOP11_20;
    2. import java.util.*;
    3. import java.util.stream.Collectors;
    4. /**
    5. * 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
    6. *

    7. * 返回 滑动窗口中的最大值 。
    8. *

    9. *

    10. *

    11. * 示例 1:
    12. *

    13. * 输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
    14. * 输出:[3,3,5,5,6,7]
    15. * 解释:
    16. * 滑动窗口的位置 最大值
    17. * --------------- -----
    18. * [1 3 -1] -3 5 3 6 7 3
    19. * 1 [3 -1 -3] 5 3 6 7 3
    20. * 1 3 [-1 -3 5] 3 6 7 5
    21. * 1 3 -1 [-3 5 3] 6 7 5
    22. * 1 3 -1 -3 [5 3 6] 7 6
    23. * 1 3 -1 -3 5 [3 6 7] 7
    24. */
    25. public class TOP11 {
    26. public int[] maxSlidingWindow(int[] nums, int k) {
    27. if (nums.length == 0 || k == 0) return new int[0];
    28. Deque deque = new LinkedList<>();
    29. int[] res = new int[nums.length - k + 1];
    30. for (int j = 0, i = 1 - k; j < nums.length; i++, j++) {
    31. // 删除 deque 中对应的 nums[i-1]
    32. if (i > 0 && deque.peekFirst() == nums[i - 1])
    33. deque.removeFirst();
    34. // 保持 deque 递减
    35. while (!deque.isEmpty() && deque.peekLast() < nums[j])
    36. deque.removeLast();
    37. deque.addLast(nums[j]);
    38. // 记录窗口最大值
    39. if (i >= 0)
    40. res[i] = deque.peekFirst();
    41. }
    42. return res;
    43. }
    44. // 暴利解法
    45. private static int[] maxSliding(int[] nums, int k) {
    46. if (nums.length == 0 || k == 0) {
    47. return new int[0];
    48. }
    49. List numsList = Arrays.stream(nums).boxed().sorted().collect(Collectors.toList());
    50. if (nums.length <= k) {
    51. int[] res = new int[1];
    52. res[0] = numsList.get(numsList.size() - 1);
    53. return res;
    54. }
    55. Queue queue = new LinkedList<>();
    56. for (int i = 0; i < k; i++) {
    57. queue.add(nums[i]);
    58. }
    59. int[] res = new int[nums.length - k + 1];
    60. res[0] = getMaxInt(queue);
    61. System.out.println(res.toString());
    62. for (int i = 1; i <= nums.length - k; i++) {
    63. queue.add(nums[i + k - 1]);
    64. ((LinkedList) queue).removeFirst();
    65. res[i] = getMaxInt(queue);
    66. }
    67. return res;
    68. }
    69. private static int getMaxInt(Queue ints) {
    70. if (ints.size() == 0) {
    71. return 0;
    72. }
    73. List array = new ArrayList<>(ints);
    74. array = array.stream().sorted().collect(Collectors.toList());
    75. return array.get(array.size() - 1);
    76. }
    77. public static void main(String[] args) {
    78. int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};
    79. int[] res = maxSliding(nums, 3);
    80. System.out.println(Arrays.stream(res).boxed().collect(Collectors.toList()));
    81. }
    82. }

  • 相关阅读:
    NOSQL Redis 数据持久化
    2023牛客暑期多校训练营7 CI「位运算」「根号分治+容斥」
    vscode设置前进、后退快捷键
    一、kafka基本原理
    支付漏洞的原理与防御
    java使用poi生成excel
    重温OKHTTP源码
    前端对接阿里oss保姆级教程(第二章使用武器)
    Go map发生内存泄漏解决方法
    数字孪生+燃气管理,开启智慧燃气管理新模式
  • 原文地址:https://blog.csdn.net/harryptter/article/details/132908378