• leetcode经典例题——滑动窗口最大值


    滑动窗口最大值

    题目描述:

     

    1、暴力比较(可能超出时间限制)

    思路:题目是要求我们把大小为k的滑动窗口的最大值添加进数组并返回,所以我们首先想的肯定是每移动一次做一次判断: 

    需要一个方法,能计算滑动窗口内的最大值下标,maxVal()

    初始化参数,int i=k(即将进入滑动窗口的数),int maxIndex = maxVal()(滑动窗口最大值的下标),int index = i-k(表示滑动窗口的第一个数,即下一轮滑动要弹出的值)

    当nums[i] > nums[index] , maxIndex = i

    当nums[i] <= nums[index],有两种情况

           当index=maxIndex,重新新计算maxIndex = maxVal();

           当index != maxIndex,maxIndex不变

    直接进入代码:

    1. public int[] maxSlidingWindow(int[] nums, int k) {
    2. if (nums.length < 2|| nums == null) return nums;
    3. int[] res = new int[nums.length-k+1];
    4. int maxIndex = maxVal(nums,0,k) ;
    5. res[0] = nums[maxIndex];
    6. for(int i = k;i
    7. int index = i - k;
    8. if (nums[i] >= nums[maxIndex]){
    9. res[index+1] = nums[i];
    10. maxIndex = i;
    11. } else {
    12. if (index == maxIndex){
    13. maxIndex = maxVal(nums,index+1,i+1);
    14. res[index+1] = nums[maxIndex];
    15. }
    16. else res[index+1] = nums[maxIndex];
    17. }
    18. }
    19. return res;
    20. }
    21. private int maxVal(int[] nums ,int begin, int k){
    22. int max = nums[begin];
    23. int index = begin;
    24. for (int i = begin+1; i < k; i++) {
    25. if(max < nums[i]){
    26. max = nums[i];
    27. index = i;
    28. }
    29. }
    30. return index;
    31. }

     

    2、队列实现滑动窗口

    思路:既然是滑动窗口,一头要添加元素,一头要弹出元素,我们就可以利用队列来实现

    保证queue.peek()也就是队列的第一个值是最大值,这样我们求滑动窗口的最大值,就可以直接返回队列的queue.peek(),那我们怎么可以保证呢?

    我们就需要用一个循环,当nums[queue.peekLast()] <= nums[i],弹出队列最后一个元素queue.pollLast,直到队列中的第一个元素queue.peek()才是最大值;

    而且而外加入一个判断,如果队列中的第一个元素,也就是滑动窗口第一个元素queue.peek() <= i - k,我们直接滑动一次,弹出第一个元素;

    可以看图理解一下例题:

     

     

    进入代码:

    1. public int[] maxSlidingWindow(int[] nums, int k) {
    2. if (nums.length < 2|| nums == null) return nums;
    3. int[] res = new int[nums.length-k+1];
    4. LinkedList queue = new LinkedList<>();
    5. for (int i = 0; i < nums.length; i++) {
    6. while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i])
    7. queue.pollLast();
    8. queue.add(i);
    9. if (queue.peek() <= i - k)
    10. queue.poll(); //弹出滑动窗口第一个元素
    11. if (i+1 >= k)
    12. res[i-k+1] = nums[queue.peek()];
    13. }
    14. return res;
    15. }

    持续更新leetcode算法文章中~~

  • 相关阅读:
    Microsoft Office无法重装报错30015-44(3) 0-2031(17004)
    GreenPlum6.x之测试数据
    【Git】git创建项目仓库的方法步骤(图文一步步教新手操作)
    2_5.Linux存储的基本管理
    学习指南:如何快速上手媒体生态一致体验开发
    基于单片机的智能电子鼻的设计
    GPT-2
    [题] 筛质数 #质数(素数)
    JavaFx之使用高版本JDK(二十八)
    Unity开发之观察者模式(事件中心)
  • 原文地址:https://blog.csdn.net/weixin_72076848/article/details/126171634