题目
给定两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。
示例 1:
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
解释:
对于num1中的数字4,你无法在第二个数组中找到下一个更大的数字,因此输出 -1。
对于num1中的数字1,第二个数组中数字1右边的下一个较大数字是 3。
对于num1中的数字2,第二个数组中没有下一个更大的数字,因此输出 -1。
示例 2:
输入: nums1 = [2,4], nums2 = [1,2,3,4].
输出: [3,-1]
解释:
对于 num1 中的数字 2 ,第二个数组中的下一个较大数字是 3 。
对于 num1 中的数字 4 ,第二个数组中没有下一个更大的数字,因此输出 -1 。
提示:
nums1和nums2中所有元素是唯一的。
nums1和nums2 的数组大小都不超过1000。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
分析
- 将nums2是无重复元素的数组,新建一个字典dic,key是nums2中的元素,value是相应元素的位置。
- 新建保存结果的空列表
result
- 遍历变量nums1中的元素,通过dic找出他在nums2中的位置i,如果nums2[i:]的最大值没有比当前值大的,-1加入
result
.否则,遍历nums2[i:],如果有大于当前值的,保存到result
,否则,保存-1到result
我的解答
class Solution:
def nextGreaterElement(self, nums1, nums2):
dic = {}
result = []
for i,item in enumerate(nums2):
dic[item] = i
l = len(dic)
for item in nums1:
i = dic[item]
if max(nums2[i:])<= item:
result.append(-1)
else:
for temp in nums2[i:]:
if temp>item:
result.append(temp)
break
return result
官方解答
哈希映射
栈维护nums2中的元素,字典中保存下一个比当前值大的值
- 新建空栈
stack
,字典dic
- 遍历
nums2
中的元素–item
如果栈为空或者当前元素小于栈顶值,将item
压入栈
否则弹出栈顶值作为key
,dic[key]=item
,将item
压入栈
这两句话直译为
dic = {}
result = []
stack = []
for item in nums2:
if len(stack)>0 and stack[-1]>item :# stack[-1] index outof range
stack.append(item)
elif len(stack) == 0:
stack.append(item)
else:
while len(stack)>0:
dic[stack.pop(-1)] = item
stack.append(item)
翻译一下
- 当stack不为空且栈顶值<
item
时,需要弹出顶值最为key,item为value,直到栈为空或栈顶值>item
. - 把
item
压入栈中
nums2中的每个元素都有一次入栈和出栈动作。
dic = {}
result = []
stack = []
for item in nums2:
while len(stack) > 0 and stack[-1] < item:
dic[stack.pop(-1)] = item
stack.append(item)
完整版
class Solution:
def nextGreaterElement(self, nums1, nums2):
dic = {}
result = []
stack = []
for item in nums2:
# if len(stack)>0 and stack[-1]>item :# stack[-1] index outof range
# stack.append(item)
# elif len(stack) == 0:
# stack.append(item)
#
# else:
while len(stack)>0 and stack[-1]<item:
dic[stack.pop(-1)] = item
stack.append(item)
# print(dic)
for item in nums1:
if item in dic:
result.append(dic[item])
else:
result.append(-1)
return result