请根据每日
气温
列表temperatures
,重新生成一个列表,要求其对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0
来代替。输入:temperatures= [73,74,75,71,69,72,76,73]
输出: [1,1,4,2,1,1,0,0]
每日温度是一道很典型的单调栈的问题,就是求下一个最大****,下面先列出单调栈的模板
public int[] humdrum3tack(int[] nums) {int n = nums.length;// 存放答案的数组int[] res = new int[n];Stack<Integer> s = new Stack<>(); // 倒着往栈里放 如果是环状,则使用取模运算进行绕环for (int i = n - 1; i >= 0; i--) {// 判定个子高矮while (!s.isEmpty() && s.peek() <= nums[i]) {// 把小于当前元素的栈中元素进行弹栈s.pop();}//如果栈中没元素,则后面没有比自己大的值,如果有,则是栈顶元素res[i] = s.isEmpty() ? -1 : s.peek();s.push(nums[i]);}return res;
下面利用图进行说明:
单调栈又是什么什么原理呢?
入队的时候不断的和栈顶进行比较,小于入栈元素的直接进行出栈,如果入栈的时候栈为空,说明当前元素后面没有比当前元素大的值了
public int[] dailyTemperatures(int[] temperatures) {//对 入参进行判断if(temperatures==null||temperatures.length==0);int n=temperatures.length;Stack<Pair> stack=new Stack<>();//用来维护结果的结果数组int[] res=new int[n];//单调栈一般都是从后往前比遍历for(int i=n-1;i>=0;i--){//如果当前栈不为空且栈顶元素小于当前入栈元素,直接进行出栈while(!stack.isEmpty()&&stack.peek().val<=temperatures[i]){stack.pop();}//填充结果res[i]=stack.isEmpty()?0:stack.peek().index-i;//将当前元素进行入栈stack.push(new Pair(temperatures[i],i));}return res;}class Pair{private int val;private int index;public Pair(int val,int index){this.val=val;this.index=index;}}