代码随想录算法训练营第五十八天 |739. 每日温度、496. 下一个更大元素 I

173 阅读1分钟

739. 每日温度

代码随想录文章讲解

单调栈(Monotonic Stack)

  • 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了。时间复杂度为O(n)。

  • 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优点是只需要遍历一次。

  • 在使用单调栈的时候首先要明确如下几点:

    1. 单调栈里存放的元素是什么?

      单调栈里只需要存放元素的下标i就可以了,如果需要使用对应的元素,直接T[i]就可以获取。

    1. 单调栈里元素是递增呢? 还是递减呢?

      注意一下顺序为 从栈头到栈底的顺序

      这里我们要使用递增循序(再强调一下是指从栈头到栈底的顺序),因为只有递增的时候,加入一个元素i,才知道栈顶元素在数组中右面第一个比栈顶元素大的元素是i。

 # Time Complexity: O(N)
 # Space Complexity: O(N)
 class Solution:
     def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
         mono_stack = []
         answer = [0] * len(temperatures)
 ​
         for cur_day, cur_temp in enumerate(temperatures):
             while mono_stack and temperatures[mono_stack[-1]] < cur_temp:
                 prev_day = mono_stack.pop()
                 answer[prev_day] = cur_day - prev_day
 ​
             mono_stack.append(cur_day)
         
         return answer

496. 下一个更大元素 I

代码随想录文章讲解

单调栈(Monotonic Stack)

  • 和739. 每日温度类似,但要考虑好ans的长度以及初始化和我们需要遍历的list
 class Solution:
     def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
         ans = [-1] * len(nums1)
         mono_stack = []
         
         for num in nums2:
             while mono_stack and mono_stack[-1] < num:
                 prev_num = mono_stack.pop()
                 if prev_num in nums1:
                     ans[nums1.index(prev_num)] = num
             mono_stack.append(num)
         
         return ans