ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode 496. 503 和739题使用栈的解法以及理解

2020-02-21 20:01:40  阅读:240  来源: 互联网

标签:nums res 元素 nums1 stack 739 496 503 nums2


题目解答

496题
  • leetcode 496 题目描述

给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每个元素在 nums2 中的下一个比其大的值。
nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出-1。
输入: nums1 = [4,1,2], nums2 = [1,3,4,2].
输出: [-1,3,-1]
具体解释:略过

  • 解答
  1. 主要是考虑到用栈这个数据结构比较不容易,一旦知道了用栈这个数据结构,并且深思熟虑一下,大概都能清楚。
  2. 具体解答思路:
    • 维护一个单调递减的栈,首先,栈是空的,将第一个元素A[1]入栈,若A[2]大于A[1],则说明A[2]就是A[1]的下一个最大元素,此时将A[1]出栈,A[2]入栈。若A[3]小于A[2],则将A[3]入栈。即栈中的元素从底部到顶部是依次递减的。
    • 使用一个Hash表维护nums2中的每一个元素的下一个最大值。之后便利nums1即可。
      那么具体的python版代码如下:
    def nextGreaterElement(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums2_dict = {}
        stack = []
        res = [-1] * len(nums1)
        for num in nums2:
            while stack and stack[-1] < num:
                nums2_dict[stack[-1]] = num
                stack.pop()
            stack.append(num)
        for i in range(len(nums1)):
            if nums1[i] in nums2_dict.keys():
                res[i] = nums2_dict[nums1[i]]
        return res
739题,每日温度
  1. 题目描述

根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。
例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。

  1. 解答思路完全安装上述题目的思路进行,题目中只不过是找到下一个大元素的另一个问法而已。维护的栈依旧是单调递减的,只不过栈里面的元素并非是温度,而是下标,就可以完美解决这个问题。
  2. 具体的代码如下
    def dailyTemperatures(self, T):
        """
        :type T: List[int]
        :rtype: List[int]
        """
        res = [0] * len(T)
        stack = []
        for i in range(len(T)):
            while stack and T[stack[-1]] < T[i]:
                res[stack[-1]] = i - stack[-1]
                stack.pop()
            stack.append(i)
        return res
503题 下一个最大元素2
  1. 题目描述

给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。
示例:
输入: [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数;
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

解答思路

该题目的主要难点在于是循环列表,也就是和上面相比差别最大的一点。我最开始想到的做法就是得到最后的栈,然后再遍历栈中的元素,再去列表中查找,得到栈中的元素的下一个最大的元素的位置。
具体的代码如下:

    def nextGreaterElements(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        res = [-1] * len(nums)
        stack = []
        for i in range(len(nums)):
            while stack and nums[stack[-1]] < nums[i]:
                res[stack[-1]] = nums[i]
                stack.pop()
            stack.append(i)
        while stack:
            for i in range(stack[-1]):
                if nums[i] > nums[stack[-1]]:
                    res[stack[-1]] = nums[i]
                    break
            stack.pop()
        return res

这个算法也可以过,但是时间复杂度稍微高了一些,看了答案才发现,只需要将列表中的元素入栈两次就可以了。确实没有想到。具体的代码就先不写了。

最后的思考

最开始觉得栈这个数据结构很简单啊,就是先入后出嘛,并没有什么难的地方。后来才发现。越是简单的数据结构,也是不容易想到在解决问题的时候应用。另外,如何应用,怎么应用,这才是最难的地方。还是需要努力练习,多多学习。

冰冻三尺,非一日之寒。努力奋斗的码农~加油

sholy123 发布了11 篇原创文章 · 获赞 1 · 访问量 9972 私信 关注

标签:nums,res,元素,nums1,stack,739,496,503,nums2
来源: https://blog.csdn.net/weixin_41850360/article/details/104433341

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有