zoukankan      html  css  js  c++  java
  • [Notes] 2020.6.11 每日一题 温度升高检查

    题目

    根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
    
    例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。
    
    提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/daily-temperatures
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    

    思路

    1. 最简单,多层for循环搜索。复杂度O(n^2)
    2. 官方思路,单调栈。复杂度O(n)
    3. 官方思路,自后向前遍历。复杂度O(mn)

    思路2是通过大空间换时间,首先构建温度30100每个温度第一次出现的下标记录表,这样从后向前遍历的时候,每遍历到一个温度值t,就在表格中搜索t100度之间,第一次出现下标里最小的值,那个值就是下一次比t温度高的天的index。

    思路3是通过遍历一次数组,将每个高值对应的多个低值相应的间隔统一设置。

    这里的重点是多对一映射,应该由一向多去遍历;有意思的是单调栈这么个结构。

    单调栈顾名思义,就是栈中的元素有对应的递增或者递减关系。这意味这个栈适用维护一种的排序关系的情况,因为栈的动态性,这种结构应该比较适合动态维护一种单调的排序关系。但是它和堆、红黑树又不一样,它因为有着栈的特性——后进先出,因此适用于多对一的局部排序(例如,对于递增栈,新元素比栈顶元素大,则栈顶元素要退栈),因此这个结构并不强调元素之间全面的比较。

    解法

    思路1:

    class Solution:
        def dailyTemperatures(self, T: List[int]) -> List[int]:
            length = len(T)
            result = [0 for i in range(length)]
            for i in range(length):
                aa = T[i]
                for j in range(i, length):
                    if T[j] > aa:
                        result[i] = j - i
                        break
            return result
    

    注意,这个会超时。

    思路2:

    class Solution:
        def dailyTemperatures(self, T: List[int]) -> List[int]:
            length = len(T)
            result = [0] * length
            stack = []
            for i in range(length):
                current = T[i]
    
                while len(stack)>0 and current > T[stack[-1]]:
                    tmpIndex = stack.pop()
                    result[tmpIndex] = i - tmpIndex
    
                stack.append(i)
            return result
    

    思路3:

    class Solution:
        def dailyTemperatures(self, T: List[int]) -> List[int]:
            length = len(T)
            result = [0] * length
            tmpTable = {}
            MAX_VALUE = 300001
    
            for i in range(length-1,-1,-1):
                tmpTable[T[i]] = i
                tmpMinT = MAX_VALUE
                for j in range(T[i]+1,101):
                    if (j in tmpTable) and (tmpTable[j] < tmpMinT):
                        tmpMinT = tmpTable[j]
                result[i] = tmpMinT - i if tmpMinT != MAX_VALUE else 0
            return result
    
  • 相关阅读:
    Activemq+Zookeeper集群
    Centos7 安装 ActiveMQ 5.15.1
    189. Rotate Array
    188. Best Time to Buy and Sell Stock IV
    187. Repeated DNA Sequences
    186.Reverse Words in a String II
    179. Largest Number
    174. Dungeon Game
    173. Binary Search Tree Iterator
    172. Factorial Trailing Zeroes
  • 原文地址:https://www.cnblogs.com/immortalBlog/p/13092814.html
Copyright © 2011-2022 走看看