leetcode - [239] Sliding Window Maximum

来源:互联网 发布:植物学 网络 编辑:程序博客网 时间:2024/05/16 15:17
public class Solution {    // 思路:使用一个队列来保存当前窗口内的可能出现的最大值的候选者 (看了discuss)    LinkedList<Integer> queue = new LinkedList<Integer>();    public int[] maxSlidingWindow(int[] nums, int k) {        if (nums == null || nums.length == 0 || k < 1) {            return new int[0];        }        ArrayList<Integer> maxValues = new ArrayList<Integer>();        int i = 0;        for (; i < nums.length && i < k; i++) {            insert2Queue(nums[i]);        }        maxValues.add(queue.get(0));        if (i == nums.length) { // nums.length <= k, 直接返回queue首部的值            return convert(maxValues);        }        for (int j = i; j < nums.length; j++) {            if (nums[j-k] == queue.peek()) {                queue.remove(0);            }            insert2Queue(nums[j]);            maxValues.add(queue.peek()); // 当前队列首部的元素是窗口中最大的值        }        return convert(maxValues);    }    // 插入队列,使用以下原则:移除队列中所有小于当前插入值val的值    private void insert2Queue(int val) {        LinkedList<Integer> tmpQueue = new LinkedList<Integer>();        if (queue.size() > 0) {            for (int i = 0; i < queue.size(); i++) {                if (queue.get(i) >= val) {                    tmpQueue.add(queue.get(i));                }            }        }        tmpQueue.add(val);        queue = tmpQueue;    }    private int[] convert(List<Integer> values) {        if (values == null || values.size() == 0) {            return new int[0];        }        int[] rets = new int[values.size()];        int i = 0;        for (int val : values) {            rets[i++] = val;        }        return rets;    }}

0 0
原创粉丝点击