队列的最大值(Java实现)


import java.util.*;

public class E59MaxInQueue {
    //队列的最大值

    /*问题一:滑动窗口的最大值*/
    public static Queue<Integer> getMaxInWindows(int[] queue, int windowsSize) {
        if (queue == null || queue.length < windowsSize || windowsSize <= 0)
            return null;
        Queue<Integer> results = new LinkedList<>();
        Deque<Integer> finder = new LinkedList<>();
        for (int i = 0; i < windowsSize; i++) {
            while (!finder.isEmpty() && queue[finder.peekLast()] <= queue[i])
                finder.removeLast();
            while (!finder.isEmpty() && finder.peekFirst() <= i - windowsSize)
                finder.removeFirst();
            finder.addLast(i);
        }
        for (int i = windowsSize; i < queue.length; i++) {
            results.add(queue[finder.peekFirst()]);
            while (!finder.isEmpty() && queue[finder.peekLast()] <= queue[i])
                finder.removeLast();
            while (!finder.isEmpty() && finder.peekFirst() <= i - windowsSize)
                finder.removeFirst();
            finder.addLast(i);
        }
        results.add(queue[finder.peekFirst()]);
        return results;
    }

    /*问题二:定义一个队列并且实现add、remove和max函数,时间复杂度都为O(1)*/
    public class SpecialQueue<T extends Comparable<T>> {
        private class QueueData {
            int index;
            T data;

            QueueData(int index, T data){
                this.index = index;
                this.data = data;
            }
        }

        private Deque<QueueData> finder;
        private Queue<QueueData> container;
        private int index;

        public SpecialQueue() {
            finder = new LinkedList<>();
            container = new LinkedList<>();
            index = 0;
        }

        public void add(T data){
            while(!finder.isEmpty() && finder.peekLast().data.compareTo(data) <= 0)
                finder.removeLast();
            QueueData queueData = new QueueData(index, data);
            index++;
            finder.addLast(queueData);
            container.add(queueData);
        }

        public T remove(){
            if (container.isEmpty())
                throw new IllegalArgumentException("Empty Queue!");
            if (container.peek().index == finder.peekFirst().index)
                finder.removeFirst();
            return container.remove().data;
        }

        public T max(){
            if (container.isEmpty())
                throw new IllegalArgumentException("Empty Queue!");
            return finder.peekFirst().data;
        }
    }

    //测试用例
    public static void main(String[] args) {
        /*问题一*/
        int[] queue = {2, 3, 4, 2, 6, 2, 5, 1};
        Queue<Integer> results = E59MaxInQueue.getMaxInWindows(queue, 3);
        for (int result : results)
            System.out.print(result + "\t");
        System.out.println();
        /*问题二*/
        SpecialQueue<Integer> specialQueue = new E59MaxInQueue().new SpecialQueue<>();
        specialQueue.add(5);
        specialQueue.add(2);
        specialQueue.add(3);
        System.out.println(specialQueue.max()); // 5
        specialQueue.remove();
        System.out.println(specialQueue.max()); // 3
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值