代码随想录算法训练营第天 |
739.每日温度
https://leetcode.cn/problems/daily-temperatures/description/
代码随想录
https://programmercarl.com/0739.每日温度.html#其他语言版本
496.下一个更大元素 I
https://leetcode.cn/problems/next-greater-element-i/description/
代码随想录
https://programmercarl.com/0496.下一个更大元素I.html#算法公开课
503.下一个更大元素II
https://leetcode.cn/problems/next-greater-element-ii/description/
代码随想录
https://programmercarl.com/0503.下一个更大元素II.html#算法公开课
739.每日温度
- 要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时我们就要想到可以用单调栈了
- 用一个栈来记录我们遍历过的元素
- 递增循序:栈头栈底
- 具体操作:
-保证新增栈元素是栈内最小的值;
-遇到比栈顶值大的值 弹出该值 该值找到了最近的比其大的值 增加至结果;
点击查看代码
class Solution:
def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
st = [0]
res = [0]*len(temperatures)
for i in range(len(temperatures)):
while len(st)>0 and temperatures[i]>temperatures[st[-1]]:
res[st[-1]] = i-st[-1]
st.pop()
st.append(i)
return res
496.下一个更大元素 I
- 更改元素主体 本质没有变
- 只需要在nums2中遍历出结果 然后按照nums1放置结果
点击查看代码
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
res = [-1]*len(nums1)
st = [0]
for i in range(1,len(nums2)):
while len(st)>0 and nums2[i]>nums2[st[-1]]:
if nums2[st[-1]] in nums1:
index = nums1.index(nums2[st[-1]])
res[index] = nums2[i]
st.pop()
st.append(i)
return res
503.下一个更大元素II
- 只需要解决循环的问题
- 通过遍历数组两遍即可解决 i = i%n
点击查看代码
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
res = [-1]*len(nums)
st = [0]
n = len(nums)
for i in range(1,2*len(nums)):
while len(st)>0 and nums[i%n]>nums[st[-1]]:
res[st[-1]] = nums[i%n]
st.pop()
st.append(i%n)
return res