下一个更大元素Ⅰ和Ⅱ

    科技2022-07-12  114

    文章目录

    前言一、下一个更大元素Ⅰ1.题目介绍2.我的思路和代码3.大佬的思路和代码 二、下一个更大元素Ⅱ1.题目介绍2.我的思路和代码3.大佬的思路和代码 总结

    前言

    好几天没有写,因为最近做的题都是看的大佬的,几乎没有自己独立完成,而最近在做今日温度这个题,本来是准备直接白嫖大佬的,结果大佬说做完496和503就会写了,于是我就写了一下496.

    一、下一个更大元素Ⅰ

    1.题目介绍

    给定两个 没有重复元素 的数组 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

    2.我的思路和代码

    这题目的数组大小比较小,所以暴力就行了。我想的是先遍历nums1,然后通过一个find_addres函数找这个值在nums2的位置,然后遍历从这个位置到nums2完,其中夹杂了一个计算的变量,用来判断是否有比这个数大的数,代码如下。(耗时而且内存消耗大)

    class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: def find_address(m,l): for i in range(len(l)): if m == l[i]: return i stack = [] count = 0 for i in nums1: count = 0 m = find_address(i,nums2) for j in range(m,len(nums2)): if nums2[j] > i: stack.append(nums2[j]) break else: count += 1 if count == len(nums2)-m: stack.append(-1) return stack

    3.大佬的思路和代码

    找了一个北邮大佬的代码,批注十分详细易懂,我就不加赘述了。

    class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: ans = [] # 存储答案 for n1 in nums1: # 遍历 nums1 temp = -1 # 默认填入 -1 (未找到该值) for n2 in nums2[nums2.index(n1):]: # 在 nums2 中找到 n1 的位置,并截取列表 if n2 > n1: temp = n2 # 找到 n1 对应的答案 break ans.append(temp) # 添加答案 return ans 作者:Lykr 链接:https://leetcode-cn.com/problems/next-greater-element-i/solution/python-ti-jie-by-lykr/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    下面的代码和单调栈有关。简单谈一下思路,首先这道题强调了没有重复的元素,于是我们就应该首先想到字典,因为字典的键是不能重复的,正好可以将nums2里面的元素作为字典的键,而把在它右边比它大的第一个元素作为值,最后利用字典的get输出对应的值就行了。

    class Solution: def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]: stack, hashmap = list(), dict() for i in nums2: while len(stack) != 0 and stack[-1] < i:hashmap[stack.pop()] = i stack.append(i) return [hashmap.get(i,-1) for i in nums1] 作者:qsctech-sange 链接:https://leetcode-cn.com/problems/next-greater-element-i/solution/python3-wu-xing-dai-ma-di-jian-zhan-ha-xi-biao-by-/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    二、下一个更大元素Ⅱ

    1.题目介绍

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。

    示例 1:

    输入: [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。 注意: 输入数组的长度不会超过 10000。

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/next-greater-element-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    2.我的思路和代码

    当我看到输入数组的长度不超过10000时,我就冥冥之中有有一种感觉,暴力好像行,于是,简单的尝试了一下,果然暴力行。大概的思路是一个循环里面嵌套两个循环,先是一个大循环遍历nums,然后是一个部分循环遍历从i到最后的nums,如果找到比它大的就跳出循环,否则进入下一个部分循环遍历0到i的nums,如果找到比它大的就跳出循环,否则就插入-1。代码如下:(思路简单,然而内存和速度就一言难尽了…)

    class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: stack = [] times = len(nums) for i in range(times): count = 0 t = nums[i] mark = 0 for j in range(i,times): if nums[j] > nums[i]: stack.append(nums[j]) mark = -1 break else: count += 1 if count == times - i and mark!= -1: for k in range(0,i): if nums[k] > nums[i]: stack.append(nums[k]) break else: count += 1 if count == times: stack.append(-1) return stack

    3.大佬的思路和代码

    因为是循环数组,于是大佬直接将nums相拼接,这样就可以保证遍历一遍数组,接下来的操作和下一个元素Ⅰ类似,只不过少了字典,然后循环判断的条件改变了而已。我的理解是有点像有效的括号那题的主要思路,就是首先要找到满足栈最后一个元素的符合条件的值,然后是倒数第二个,只不过有效的括号是相匹配的括号,而下一个元素Ⅱ是大于这个数的数。

    class Solution: def nextGreaterElements(self, nums: List[int]) -> List[int]: nums = nums + nums stack = [] res = [-1] * len(nums) for i in range(len(nums)): while stack and nums[i] > nums[stack[-1]]: small = stack.pop() res[small] = nums[i] stack.append(i) return res[:len(res)//2] 作者:black_manba 链接:https://leetcode-cn.com/problems/next-greater-element-ii/solution/pythonban-di-jian-zhan-by-black_manba/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    总结

    呼应一下前言吧,那个大佬说的是对的,将503题下一个元素Ⅱ的代码稍微改一下就可以得到每日温度的正确答案。

    Processed: 0.012, SQL: 8