496. 下一个更大元素 I
496. 下一个更大元素 I
- 题目
- 分析
- 我的解答
- 官方解答
题目
给定两个 没有重复元素 的数组 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] = il = 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)breakreturn 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 rangestack.append(item)elif len(stack) == 0:stack.append(item)else:while len(stack)>0:dic[stack.pop(-1)] = itemstack.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)] = itemstack.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)] = itemstack.append(item)# print(dic)for item in nums1:if item in dic:result.append(dic[item])else:result.append(-1)return result
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
