问题描述
Next Greater问题:即为下一个最大元素的问题
给定一个数组nums=[2, 3, 1, 5, 6, 4],寻找数组中每一个元素之后的最大元素,如果该元素不存在,则用-1进行代替
解决方法
基本思想:使用单调栈进行解决,栈中的元素总是从栈顶到栈底递减或不变,因此,每一次遍历结束后,栈顶元素一定是较大的。
实现方法
准备工作
- 定义一个空类,继承异常类,用于错误抛出
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@ModuleName: Empty
@Function: 定义一个空类
@Author: PengKai
@Time: 2020/11/17 21:15
"""
class Empty(Exception):
pass
- 定义一个ArrayStack类,用列表实现一个栈
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
@ModuleName: Stack
@Function: 基于列表实现一个栈
@Author: PengKai
@Time: 2020/11/17 21:11
"""
import Empty
class ArrayStack:
def __init__(self):
"""
初始化栈为一个列表
"""
self._data = []
def __len__(self):
"""
实现计算栈的长度的方法
"""
return len(self._data)
def is_empty(self):
"""
判断栈是否为空
"""
return len(self._data) == 0
def push(self, e):
"""
元素入栈
"""
self._data.append(e)
def top(self):
"""
获取栈顶元素
"""
if self.is_empty():
raise Empty.Empty('Stack is empty')
return self._data[-1]
def pop(self):
"""
元素出栈
"""
if self.is_empty():
raise Empty.Empty('Stack is empty')
return self._data.pop()
具体实现
- 初始化一个栈,用于进行元素查找;初始化一个数组ans,数组中存储长度为nums长的元素,元素的值均为-1
- 遍历整个数组,如果栈为空且栈顶元素小于当前数组中的值,则栈顶元素出栈且修改数组ans中对应位置的值
- 将新的数组值的下标值入栈
具体实现代码如下图所示
from Stack import ArrayStack
def solution(nums):
n = len(nums)
ans = [-1] * n
stack = ArrayStack()
for i in range(n):
num = nums[i]
while not stack.is_empty() and nums[stack.top()] < num:
t_index = stack.pop()
ans[t_index] = num
stack.push(i)
return ans
if __name__ == '__main__':
nums = [2, 3, 1, 5, 6, 4]
ans = solution(nums)
print(ans)
练习
第一题 Leetcode496-下一个更大元素
题目描述
解决方法
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
ans, stack = [], []
map_nums = {}
for num in nums2:
while stack and stack[-1] < num:
top = stack.pop()
map_nums[top] = num
stack.append(num)
for num in nums1:
if num in map_nums:
ans.append(map_nums[num])
else:
ans.append(-1)
return ans
第二题 Leetcode739-每日温度
题目描述
解决方法
class Solution:
def dailyTemperatures(self, T: List[int]) -> List[int]:
n = len(T)
ans, stack = [0] * n, []
for i in range(n):
t = T[i]
while stack and T[stack[-1]] < t:
t_index = stack.pop()
ans[t_index] = i - t_index
stack.append(i)
return ans