IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode:下一个更大元素——单调栈解决 Next Greater Number 问题 -> 正文阅读

[数据结构与算法]LeetCode:下一个更大元素——单调栈解决 Next Greater Number 问题

读完本文章,你可以去LeetCode上拿下下面两个题目!!!

496.下一个更大元素I(单调栈+map)
503.下一个更大元素II

Next Greater Number原始问题

给你一个数组,返回一个等长数组,对应索引存储着下一个更大的元素,若没有更大元素,就存-1。

  • 例:给你一个数组[2,1,2,4,3],你需要返回数组[4,2,4,-1,-1]
  • 解释:第一个2后面比2大的数是4,1后面比1大的数是2,第二个 2 后面比 2 大的数是 4; 4 后面没有比 4 大的数,填 -1;3 后面没有比 3 大的数,填 -1。

解题思路

暴力法

暴力法就是对每个元素后面进行遍历,找到第一个更大的元素存到返回数组中,没有更大的就存-1,详细代码不展示。

单调栈法

首先我们进行抽象思考:我们将数组的元素看成站立在一排的人,元素大小就是人的身高,问题就抽象为每个人能看到第一个比自己高的人的身高,没有比自己高的人话,就是-1。

这样应该让大家更好的理解了!下面根据代码讲解

vector<int> nextGreaterElement(vector<int>& nums) {
    vector<int> rs(nums.size()); // 返回的数组
    stack<int> s;
    for (int i = nums.size() - 1; i >= 0; i--) { // 倒着往栈里放
        while (!s.empty() && s.top() <= nums[i]) { // 判定个子高矮
            s.pop(); // 矮个起开,反正也被挡着了。。。
        }
        rs[i] = s.empty() ? -1 : s.top(); // 这个元素身后的第一个高个
        s.push(nums[i]); // 进队,接受之后的身高判定吧!
    }
    return rs;
}
  • 如何更高效地计算nums中每个元素右边的第一个更大的值?
  • 倒序遍历nums,并用单调栈维护当前位置右边的更大的元素列表,从栈底到栈顶的元素是单调递减的。
  • 每次我们移动到数组中一个新的位置 i,就将当前单调栈中所有小于 nums[i]的元素弹出单调栈,当前位置右边的第一个更大的元素即为栈顶元素。
  • 如果栈为空则说明当前位置右边没有更大的元素,存入-1,否则存入栈顶元素。
  • 然后将当前元素入栈,i–往前移动继续上述步骤,直到遍历完为止。

(进阶)循环数组——下一个更大元素问题

解题思路

  1. 思路同前面讲解例题一致。只是数组是进行循环的。
  2. 例: 给你一个数组 [2,1,2,4,3],你返回数组 [4,2,4,-1,4]。
  3. 拥有了环形属性,最后一个元素 3 绕了一圈后找到了比自己大的元素 4
  4. 我们将数组长度放大一倍,对下标进行取模得到下标来达到循环的效果。

    这样应该让大家更好的理解了!下面根据代码讲解
vector<int> nextGreaterElements(vector<int>& nums) {
    int n = nums.size();
    vector<int> rs(n); // 存放返回的结果
    stack<int> s;
    // 假装这个数组长度翻倍了 len=2*n
    for (int i = 2 * n - 1; i >= 0; i--) {
        while (!s.empty() && s.top() <= nums[i % n])
            s.pop();
        rs[i % n] = s.empty() ? -1 : s.top();
        s.push(nums[i % n]);
    }
    return rs;
}

力扣相关例题

496.下一个更大元素I(单调栈+map)
503.下一个更大元素II

以上两个题和上述的思路一样,请大家试试!!!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-28 12:36:29  更:2021-10-28 12:37:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:56:59-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码