剑指Offer59-I:滑动窗口的最大值(Java)

题目描述:
剑指Offer59-I:滑动窗口的最大值(Java)_第1张图片
解法1:
    这种解法思路比较简单。首先构造双指针,一个在前,一个在后,这样就可以构成一个滑动窗口。因为滑动窗口的大小是k,因此我们也可以使用一个指针来完成。一个指针为i,一个指针为i+k-1;只要后指针还没到达数组底部,每次前后指针都同时前移一个单位。然后我们通过for循环比较出窗口中元素的最大值,并记录下来。最后返回记录数组即可。

class Solution {
     
    int count = 0;
    public int[] maxSlidingWindow(int[] nums, int k) {
     
        if(k > nums.length || nums.length == 0) return new int[0];
        int i = 0; 
        int[] res = new int[nums.length - k + 1];
        while(i + k - 1 <= nums.length - 1){
     
            int max = nums[i];
            for(int j = i; j <= i + k - 1; j++){
     
                if(nums[j] > max) max = nums[j];
            }
            res[count] = max;
            i++; count++;
        }
        return res;
    }
}

剑指Offer59-I:滑动窗口的最大值(Java)_第2张图片
解法2:
    这种解法是通过队列去解决它。

class Solution {
     
    public int[] maxSlidingWindow(int[] nums, int k) {
     
        if(nums.length == 0 || k == 0) return new int[0];
        Deque<Integer> deque = new LinkedList<>();
        int[] res = new int[nums.length - k + 1];
        for(int i = 0; i < k; i++) {
      // 未形成窗口
            while(!deque.isEmpty() && deque.peekLast() < nums[i])
                deque.removeLast();
            deque.addLast(nums[i]);
        }
        res[0] = deque.peekFirst();
        for(int i = k; i < nums.length; i++) {
      // 形成窗口后
            if(deque.peekFirst() == nums[i - k])
                deque.removeFirst();
            while(!deque.isEmpty() && deque.peekLast() < nums[i])
                deque.removeLast();
            deque.addLast(nums[i]);
            res[i - k + 1] = deque.peekFirst();
        }
        return res;
    }
}

剑指Offer59-I:滑动窗口的最大值(Java)_第3张图片

你可能感兴趣的:(数据结构和算法,指针,leetcode,java,动态规划,数据结构)