import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 每日温度
     * @param dailyTemperatures int整型一维数组 
     * @return int整型一维数组
     */
    // 单调栈: 如果题目的要求是,求某一个位置的左右两侧,离它最近比它大的数,那么栈底到栈顶是从大到小的。(栈中存放的是下标,而不是数本身)
    // 如果新来的一个数,破化了栈的单调性,那么就依次弹出栈中的元素,弹出的元素的右侧离它最近的元素就是当前数。(无论任何时候,栈都要保持单调性)
    public int[] temperatures (int[] dailyTemperatures) {
        // write code here
        Stack<Integer> stack = new Stack<>();
        int[] res = new int[dailyTemperatures.length];
        for (int i = 0; i < dailyTemperatures.length; i++) {
            int val = dailyTemperatures[i];
            while (!stack.isEmpty() && dailyTemperatures[stack.peek()] < val) {
                int index = stack.pop(); // 下标
                res[index] = i - index;
            }
            stack.push(i);
        }
        while (!stack.isEmpty()) {
            int index = stack.pop(); // 下标
            res[index] = 0;
        }
        return res;
    }
}