503. 下一个更大的元素II
链接
https://leetcode.cn/problems/next-greater-element-ii/description/
思路
我在单调栈这块是真的不会......稍微一变就想不明白了, 得找个时间攻克一下
这个题目,我能想到的办法就是把数组拉长到2倍(模拟循环数组),然后对其进行单调栈处理
首先,我们要求的是下一个更大的元素,所以单调栈应该是递减的。
之所以这个题目可以从前往后遍历, 是因为这是个循环数组(我猜测是这样的,我真的想不懂...)
但更符合思路的,显然是从后往前遍历了!
代码一:从前往后遍历
class Solution: def nextGreaterElements(self, nums): if not nums: return [] # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比 res = [-1 for i in nums+nums[:-1]] single_stack = [] # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比 new_nums = nums + nums[:-1] for i, v in enumerate(new_nums): while single_stack and new_nums[single_stack[-1]] < new_nums[i]: top_val_index = single_stack.pop() res[top_val_index] = new_nums[i] single_stack.append(i) return res[:len(nums)]
代码二:从后往前遍历(更符合我的思维习惯)
class Solution: def nextGreaterElements(self, nums): if not nums: return [] # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比 res = [-1 for i in nums+nums[:-1]] single_stack = [] # 拉长, 一个最朴素的道理, 如果不能确定, 就比较2圈, 因为循环数组就是除了自己和其他人都要比 new_nums = nums + nums[:-1] # 果然, 倒着遍历好想多了.... for i in range(len(new_nums)-1, -1, -1): while single_stack and new_nums[single_stack[-1]] <= new_nums[i]: single_stack.pop() if single_stack: res[i] = new_nums[single_stack[-1]] single_stack.append(i) return res[:len(nums)]