最大二叉树
给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。
单调栈:单调栈保存的是下标
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
n=len(nums)
stk=[]
tree=[None]*n
for i in range(n):
tree[i]=TreeNode(nums[i])
while stk and nums[i]>nums[stk[-1]]:
tree[i].left=tree[stk[-1]]//将栈中小的接在现大结点的左
stk.pop()//出栈
if stk:
tree[stk[-1]].right=tree[i]//维持树结构
stk.append(i)//入栈
return tree[stk[0]]
下一个更大元素
给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。
数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。
单调栈:
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
stk=[]
n=len(nums)
ret=[-1]*n//不存在更大的元素设为-1
for i in range(n*2-1)://因为最多循环两遍数组
while stk and nums[i%n]>nums[stk[-1]]://i%n 得当前下标
ret[stk.pop()]=nums[i%n]
stk.append(i%n)//入栈
return ret