class Solution:
def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:
#暴力解法
res = []
for i in range(len(nums1)):
index = nums2.index(nums1[i])
flag = False
while index<len(nums2):
if nums2[index]>nums1[i]:
flag = True
break
index+=1
if flag:
res.append(nums2[index])
else:
res.append(-1)
return res
#单调栈
stack = []
dic = dict()
#这样做使得num2中每个元素如果存在下一个比他大的元素,那么就会形成键值对。
#然后让nums1中的元素去查找它,如果找到了就返回该值,如果找不到那就返回-1
for num in nums2:
while stack and stack[-1]<num:
dic[stack.pop()] = num
stack.append(num)
return [dic.get(num,-1) for num in nums1]
- 暴力法比较好想,但是效率不是很高
- 利用单调栈形成hash表,键值对都是递增的,然后num1在该hahs表执行查找操作即可
- 单调栈这个方法万万没想到,但是效率是比较高一些
class Solution:
def nextGreaterElements(self, nums: List[int]) -> List[int]:
n = len(nums)
#ret放的是最终结果
ret = [-1] * n
#栈放得是索引
stk = []
for i in range(n * 2):
while stk and nums[stk[-1]] < nums[i % n]:
ret[stk.pop()] = nums[i % n]
stk.append(i % n)
return ret
- 既然是循环的数组,那就将数组拉直即可,也就是在原数组的后面在追加一个数组
- 给栈里面存放的不在是数值和是列表的下标
- 因为拉直了,所以取当前元素的花就要对n取模