739 Daily Temperatures

Given a list of daily temperatures, produce a list 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 temperatures = [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].



自己写的O(n方)的算法,超时了没AC

class Solution(object):
    def dailyTemperatures(self, temperatures):
        """
        :type temperatures: List[int]
        :rtype: List[int]
        """
        result=[]
        for i in range (0,len(temperatures)-1):
            for j in range(i+1,len(temperatures)):
                if (temperatures[i]<temperatures[j]): 
                    print("current j is",j,"i is",i,"j-i is",j-i) 
                    result.append(j-i)
                    break
                if j == len(temperatures)-1:
                    result.append(0)
              
                    
                
        result.append(0)#最后一个温度,因为是最后一个,所以不会有比它更高的温度
                    
                    
        return result
                
                  



这道题的标签是HashMap,于是我看下别人咋写的

class Solution(object):
    def dailyTemperatures(self, T):
        """
        :type temperatures: List[int]
        :rtype: List[int]
        """
        ans = [0] * len(T)
        stack = [] #indexes from hottest to coldest
        for i in xrange(len(T) - 1, -1, -1):#改成range也能AC
            while stack and T[i] >= T[stack[-1]]:
                stack.pop()
            if stack:
                ans[i] = stack[-1] - i
            stack.append(i)
        return ans

Amazing!

为了方便理解可以看下面:

T = [73, 74, 75, 71, 69, 72, 76, 73]

ans = [0] * len(T)
stack = [] #indexes from hottest to coldest
for i in range(len(T) - 1, -1, -1):
            print("i is ",i)
            while stack and T[i] >= T[stack[-1]]:
                stack.pop()
                print("stack after pop is", stack)
            if stack:
                ans[i] = stack[-1] - i
                print("stack[-1] is",stack[-1],"so ans[i] is ",ans[i] )
            stack.append(i)
            print("stack after append is ",stack)

print("result is ",ans)


运行结果是

i is  7
stack after append is  [7]
i is  6
stack after pop is []
stack after append is  [6]
i is  5
stack[-1] is 6 so ans[i] is  1
stack after append is  [6, 5]
i is  4
stack[-1] is 5 so ans[i] is  1
stack after append is  [6, 5, 4]
i is  3
stack after pop is [6, 5]
stack[-1] is 5 so ans[i] is  2
stack after append is  [6, 5, 3]
i is  2
stack after pop is [6, 5]
stack after pop is [6]
stack[-1] is 6 so ans[i] is  4
stack after append is  [6, 2]
i is  1
stack[-1] is 2 so ans[i] is  1
stack after append is  [6, 2, 1]
i is  0
stack[-1] is 1 so ans[i] is  1
stack after append is  [6, 2, 1, 0]
result is  [1, 1, 4, 2, 1, 1, 0, 0]



猜你喜欢

转载自blog.csdn.net/u011462357/article/details/79203524