队列的最大值

题目:

请定义一个队列并实现函数max得到队列里的最大值,要求函数max、push_back、pop_front的时间复杂度都是O(1)

 

思路:

利用一个双向队列存储当前队列中最大值以及之后可能的最大值。在定义题目要求功能的队列时,除了定义一个队列data存储数值,还要额外用一个队列maximum存储可能的最大值;此外,还要定义一个数据结构,用于存放数据以及当前index的值,用于删除时确定是否删除maximum中的最大值。

 1 import java.util.ArrayDeque;
 2 
 3 public Solution {
 4     private ArrayDeque<InternalData> data = new ArrayDeque<InternalData>();
 5     private ArrayDeque<InternalData> maximum = new ArrayDeque<InternalData>();
 6 
 7     private class InternalData {
 8         int number;
 9         int index;
10 
11         public InternalData(int number, int index) {
12             this.number = number;
13             this.index = index;
14         }
15 
16     }
17 
18     private int curIndex;
19 
20     public void pop_front() {
21         if(data.isEmpty()) {
22             System.out.println("queue is empty");
23             return;
24         }
25 
26         InternalData curData = data.removeFirst();
27         if(curData.index == maximum.getFirst().index) {
28             maximum.removeFirst();
29         }
30     }
31 
32     public int max() {
33         if(maximum == null) {
34             System.out.println("queue is empty");
35             return 0;
36         }
37 
38         return maximum.getFirst().number;
39     }
40 
41     public void push_back(int number) {
42         InternalData curData = new InternalData(number, curIndex);
43         data.addLast(curData);
44 
45         while(!maximum.isEmpty() && maximum.getLast().number < number) {
46             maximum.removeLast();
47         }
48 
49         maximum.addLast(curData);
50         curIndex++;
51     }
52 
53     public static void main(String[] args) {
54         Solution s = new Solution();
55 
56         // {2}
57         s.push_back(2);
58         System.out.println(s.max());
59 
60         s.push_back(3);
61         // {2,3}
62         System.out.println(s.max());
63 
64         s.pop_front();
65         // {3}
66         System.out.println(s.max())
67 
68     }
69 }

 

posted @ 2019-01-31 14:42  林木声  阅读(782)  评论(0)    收藏  举报