leetcode496. 下一个更大元素 I 【单调栈】

这篇具有很好参考价值的文章主要介绍了leetcode496. 下一个更大元素 I 【单调栈】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【简单题】(暴力遍历法很简单)但是时间复杂度很高,n的立方级别了。。。

代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans;	// 存放结果
        for (int i = 0; i < nums1.size(); i++) {
            int t = nums1[i];	// 暂存要查找的值
            for (int j = 0; j < nums2.size(); j++) {	// 在nums2中找与t相等的值
                if (nums2[j] == t) {	// 如果找到相等的值,就往后找第一个比他大的
                    int k;
                    for (k = j + 1; k < nums2.size(); k++) {
                        if (nums2[k] > t) {	// 找到第一个比它大的元素,压入该元素入栈
                            ans.push_back(nums2[k]);
                            break;
                        }
                    }
                    if (k == nums2.size()) {	// 遍历完nums2数组,没有找到比它大的元素。压入 -1 入栈
                        ans.push_back(-1);
                    }
                }
            }
        }
        return ans;
    }
};

运行结果:

leetcode496. 下一个更大元素 I 【单调栈】,LeetCode,算法,leetcode,职场和发展

 

进阶方法:

进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?

答案思路:【单调栈】

leetcode496. 下一个更大元素 I 【单调栈】,LeetCode,算法,leetcode,职场和发展

怎么样才能使得 用 nums1中的元素去 nums2中查找的时候,能够很快的不用遍历就可以查到第一个比它大的元素呢?

先预处理 num2,使得对于他的每个元素,用一个哈希表来存储第一个比他大的元素的映射。

步骤(参考leetcode官方题解)

leetcode496. 下一个更大元素 I 【单调栈】,LeetCode,算法,leetcode,职场和发展

遍历完之后 hashmap 中存储的键值对如下所示:

leetcode496. 下一个更大元素 I 【单调栈】,LeetCode,算法,leetcode,职场和发展

 

自己的话总结:

从后往前遍历(当前值为t),如果栈中的值比 t 小,则出栈到没有比它小 或 栈空位置。然后设置哈希映射,键为 t,值为 栈顶元素。然后将该元素入栈。直到遍历完第一个元素。

这样,对于 nums2中的每一个元素,在hashmap中都存储了 第一个比他大的元素 的映射。

注意:

使用 unordered_map 时,要引入库文件:#include <unordered_map>

代码:

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> mp;	// 设置哈希表
        stack<int> st;	 // 栈

        for (int i = nums2.size() - 1; i >= 0; i--) {	// 从后往前遍历 nums2
            int t = nums2[i];
            while (!st.empty() && t > st.top())		// 如果栈非空的条件下,当前值 > 栈顶元素,就出栈
                st.pop();
            if (st.empty()) {	// 如果栈为空,说明在该数组中,该元素没有第一个比它大的元素,设置它的映射值为 -1
                mp[t] = -1;
            }
            else {
                mp[t] = st.top();	// 如果栈非空,那么该元素的哈希映射值为 栈顶元素。
            }
            st.push(t);	
        }

        vector<int> ans;
        for (int i = 0; i < nums1.size(); i++) {
            ans.push_back(mp[nums1[i]]);
        }
        return ans;
    }
};

 文章来源地址https://www.toymoban.com/news/detail-683628.html

到了这里,关于leetcode496. 下一个更大元素 I 【单调栈】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【力扣】496. 下一个更大元素 I <单调栈、模拟>

      nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。给你两个没有重复元素的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。   对于每个 0 = i nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定

    2024年02月12日
    浏览(39)
  • leetcode503. 下一个更大元素 II 单调栈

    思路: 与之前 739、1475 单调栈的问题如出一辙,唯一不同的地方就是对于遍历完之后。栈中元素的处理,之前的栈中元素因无法找到符合条件的值,直接加入vector中。而这里需要再重头遍历一下数组,找是否有符合条件的,如果仍然找不到的话,才会把它赋值然后加入vecto

    2024年02月11日
    浏览(35)
  • 【单调栈】【二分查找】LeetCode: 2454.下一个更大元素 IV

    【动态规划】【广度优先】LeetCode2258:逃离火灾 单调栈分类、封装和总结 二分查找算法合集 给你一个下标从 0 开始的非负整数数组 nums 。对于 nums 中每一个整数,你必须找到对应元素的 第二大 整数。 如果 nums[j] 满足以下条件,那么我们称它为 nums[i] 的 第二大 整数: j i n

    2024年02月03日
    浏览(45)
  • LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

      Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。 🌈个人主页:主页链接 🌈算法专栏:专栏链接       我会一直往里填充内容哒! 🌈LeetCode专栏:专栏链接       目前在刷初级算法的LeetBook 。若每日一题当中有力所能

    2024年02月01日
    浏览(72)
  • 力扣题库刷题笔记496-下一个更大元素

    1、题目如下: 2、个人Python代码实现   代码如下: class Solution:     def nextGreaterElement(self, nums1: List[int], nums2: List[int]) - List[int]:         #空列表用于输出结果         ans = []         for i in nums1:             #如果nums2中不包含或者最后一位元素为当

    2023年04月26日
    浏览(39)
  • leetcode 503. 下一个更大元素 II

             本题类似于下一个更大元素I ,区别就是数组变成循环的了,可以将nums数组先double一下,如:{1,2,1}变成{1,2,1,1,2,1},再用单调栈的方法求出ans数组,最后将ans数组截一半即可。 代码如下:

    2024年02月11日
    浏览(35)
  • 【力扣】503. 下一个更大元素 II <单调栈>

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

    2024年02月12日
    浏览(41)
  • 单调栈part2 | ● 503.下一个更大元素II ● 42. 接雨水

    本篇我侧重与说一说,如何处理循环数组。 相信不少同学看到这道题,就想那我直接把两个数组拼接在一起,然后使用单调栈求下一个最大值不就行了! 确实可以! 将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resiz

    2024年02月13日
    浏览(74)
  • 【算法练习Day50】下一个更大元素II&&接雨水

    ​📝个人主页:@Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯 长路漫漫浩浩,万事皆有期待 503. 下一个更大元素 II - 力扣(LeetCode) 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更

    2024年01月22日
    浏览(36)
  • 算法刷题Day 59 下一个更大元素II+接雨水

    其实也可以不扩充nums,而是在遍历的过程中模拟走了两边nums 三种方法都写了一遍 暴力方法 逐列计算 找到当前位置,左边最高的柱子的索引和右边最高的柱子的索引,两者中相对小的那个,将去当前位置的高度,就是水柱的高度,而宽度是1 超时了 双指针 提前记录好左边最

    2024年02月14日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包