方法1:
维护一个数组对数据尽心入队和出队,需要取最大值时, 遍历数组寻找最大值,时间复杂度不符合O(1)。
方法2:
维护两个数组,一个数组用于实现数据的入队和出队,零一个数组为单调递减数组,即数组的首个元素最大,当有新入队数据时,将递减数组中比新数据小的元素都出队(这些小数据并不会对求最大值产生影响),并将新数据入队。
class MaxQueue {
//基础数组的初始化
int[] arr ;
int start = 0;
int end = 0;
//辅助数组的初始化
//辅助数组是单调递减数组,
int[] maxArr ;
int maxhead = 0;
int maxtail = 0;
public MaxQueue() {
arr = new int[10000];
maxArr = new int[10000];
}
public int max_value() {
if(start != end){
return maxArr[maxhead];
}
return -1;
}
public void push_back(int value) {
//数组末尾插入元素
arr[end++] = value;
//将辅助数组中所有比插入元素小的数都出列
while(maxhead != maxtail && maxArr[maxtail-1] < value ){
maxtail--;
}
maxArr[maxtail++] = value;
}
public int pop_front() {
if(start == end)return -1;
int value = arr[start++];
//比较出列元素是否为辅助数组的首元素(最大值),若是,则将辅助数组的首元素出列
if(maxArr[maxhead] == value){
maxhead++;
}
return value;
}
}