题目描述:
给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
涉及内容:栈
示例:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于 num1 中的数字 4 ,你无法在第二个数组中找到下一个更大的数字,因此输出 -1 。
对于 num1 中的数字 1 ,第二个数组中数字1右边的下一个较大数字是 3 。
对于 num1 中的数字 2 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
思路:
考虑到是检查对应元素后面值,这里可以利用栈的先进后出思想,直接可以弹出栈顶元素进行比较。
具体来说,初始化一个列表res存储比较结果,初始化一个栈stack来保存nums2的值。
遍历nums1,初始化一个临时存储弹出元素的栈(因为pop方法改变了栈的值,如果每个下一次比较都重新复制一次栈的话空间和时间复杂度会很高,这里用一个临时的栈的话,在每次查找结束后将刚才弹出元素再添加回去即可,复杂度来说低了不少)
设置一个isfound标记来记录是否找到当前相等元素(即找到对应元素位置),初始化为False,同时设置一个nextMAX来存储返回值(初始化为-1)
内嵌while循环栈stack(循环条件则为stack不为空且isfound不为真)来和当前弹出值进行比较,如果此时nums2中的值大于当前遍历的nums1的值,则将这个值赋值给nextMAX
如果当前nums2值等于nums1 则将isfound变为True
res.append()将这次的比较nextMAX存入数组,然后将pop弹出的数据重新添加回stack
提交结果:
这个用时、、、emmmm
完整代码:
class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
res=[]
stack=[]
for num in nums2:
stack.append(num)
for num in nums1:
temp=[]
isFound=False
nextMAX=-1
while(len(stack)!=0 and not isFound):
top=stack.pop()
if top>num:
nextMAX=top
elif top==num:
isFound=True
temp.append(top)
res.append(nextMAX)
while len(temp)!=0:
stack.append(temp.pop())
return res
思路2:
单调栈方法
原文:https://www.cnblogs.com/leohbz/p/14689242.html