'''
Given a list of daily temperatures T, return a list such that,
for each day in the input, tells you how many days you would have to wait
until a warmer temperature. If there is no future day for which this is possible, put 0 instead.

For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73],
your output should be [1, 1, 4, 2, 1, 1, 0, 0].

Note: The length of temperatures will be in the range [1, 30000].
Each temperature will be an integer in the range [30, 100].
'''


class Solution:
    def dailyTemperatures(self, T):
        '''
        :param T: List[int]
        :return: List[int]
        '''
        # Monotone Stack
        res = [0] * len(T)

        # from back to front
        stack = []
        for i in range(len(T)-1,-1,-1):
            # here, loop since we may delete several elements from list
            while stack and T[i] >= T[stack[-1]]:
                stack.pop()
            if stack:
                res[i] = stack[-1] - i
            stack.append(i)
        return res



# test
T = [73, 74, 75, 71, 69, 72, 76, 73]
print(Solution().dailyTemperatures(T))
'''
Given a list of daily temperatures T, return a list such that,
for each day in the input, tells you how many days you would have to wait
until a warmer temperature. If there is no future day for which this is possible, put 0 instead.

For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73],
your output should be [1, 1, 4, 2, 1, 1, 0, 0].

Note: The length of temperatures will be in the range [1, 30000].
Each temperature will be an integer in the range [30, 100].
'''


class Solution:
    def dailyTemperatures(self, T):
        '''
        :param T: List[int]
        :return: List[int]
        '''
        # Monotone Stack
        res = [0] * len(T)

        # from back to front
        stack = []
        for i in range(len(T)-1,-1,-1):
            # here, loop since we may delete several elements from list
            while stack and T[i] >= T[stack[-1]]:
                stack.pop()
            if stack:
                res[i] = stack[-1] - i
            stack.append(i)
        return res



# test
T = [73, 74, 75, 71, 69, 72, 76, 73]
print(Solution().dailyTemperatures(T))
Given a list of daily temperatures T, return a list such that, for each day in the input, tells you how many days you would have to wait until a warmer temperature. If there is no future day for which this is possible, put 0 instead.  For example, given the list of temperatures T = [73, 74, 75, 71, 69, 72, 76, 73], your output should be [1, 1, 4, 2, 1, 1, 0, 0].  Note: The length of temperatures will be in the range [1, 30000]. Each temperature will be an integer in the range [30, 100]. :param T: List[int]         :return: List[int] # Monotone Stack # from back to front # here, loop since we may delete several elements from list # test