LeetCode#239. Sliding Window Maximum

来源:互联网 发布:纳米袜子 知乎 编辑:程序博客网 时间:2024/06/06 00:46
  • 题目:给定一个int数组nums和一个滑动窗口值k,返回每个滑动子窗口的最大元素组成的数组(滑动子窗口是nums的连续子串,包括k个元素)
  • 难度:Hard(如果对时间复杂度没有要求,难度并不大)
  • 思路:暴力解法-两层for循环分别求出每一个子窗口的最大元素
  • 代码:
class Solution {    public int[] maxSlidingWindow(int[] nums, int k) {        if(nums == null || nums.length == 0 || k <= 0|| nums.length < k){            return nums;        }        int len = nums.length-k+1;        int[] result = new int[len];        for(int i = 0; i< nums.length-k+1; i++){            int max = nums[i];            for(int j = 0; j < k; j++){                if(nums[i+j] > max){                    max = nums[i+j];                }            }            result[i] = max;        }        return result;    }}

方法二:利用双向队列维护子窗口中最大元素

class Solution {    public int[] maxSlidingWindow(int[] nums, int k) {        if (nums == null || k <= 0) {            return new int[0];        }        int len = nums.length;        int[] result = new int[len-k+1];        int index = 0;        LinkedList<Integer> queue = new LinkedList<Integer>();        for(int i = 0; i < len; i++){            //如果第i个元素大于队列最后一个下标在数组中的值,就把队列最后一个pop掉            while(!queue.isEmpty() && nums[queue.peekLast()] < nums[i]){                queue.pollLast();            }            //已经过期的队头元素,pop掉            while(!queue.isEmpty() && queue.peek() < i-k+1){                queue.poll();            }            queue.offer(i);            if(i >= k-1){                result[index++] = nums[queue.peek()];            }        }        return result;    }}
原创粉丝点击