496. 下一个更大元素 1
“stay hungry stay young“
具体的题目描述详见LeetCode,这同样是一道简单题,根据某一元素,求出在列表中离它最近的比它大的元素,通常情况下,可以采取暴力法求解,但当数据过多时,只能采取其他的方法,对于此类问题,有一个较为经典的方法求解,就是采用单调栈的数据结构,依然是“**利用空间换时间“**的思想:
单调栈:
本质上仍然满足栈后进先出的性质,但从栈顶到栈底一定一直保持单调序列,一旦出现不单调的部分,就出栈,栈本身是动态变化的
本题的思路:
对于本题而言,首先我们考虑建立一个哈希表,在python中对应字典的数据结构,每个元素,都对应在num2中下一个比它大的元素,如果没有,返回-1,基于此操作,问题就转化成了如何建立一个dic的问题,这里采用单调栈,
当一个元素进栈的时候,首先对栈内元素进行一个判断:
- 如果当前元素比栈顶元素大,那么栈顶元素出栈,并把栈顶元素和当前元素建立一个映射
- 如果栈顶元素大于当前想要进栈的元素时,或者栈空,将该元素进栈
基于以上描述,代码如下:
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
stack=[]
dic={}
for n in nums2:
while stack and stack[-1]<n:
dic[stack.pop()]=n
stack.append(n)
return [dic.get(x,-1)for x in nums1]
复杂度分析:
时间复杂度:O(M+N) 其中 M 和 N 分别是数组 nums1 和 nums2 的长度。
空间复杂度:O(N) 我们在遍历 nums2 时,需要使用栈,以及哈希映射用来临时存储答案。