503. 下一个更大元素 II

给定一个循环数组 numsnums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素

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

示例 1:

复制代码
输入: nums = [1,2,1]
输出: [2,-1,2]
解释: 第一个 1 的下一个更大的数是 2;
数字 2 找不到下一个更大的数; 
第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

单调栈

写过 下一个更大元素I 的同学,应该可以注意到,这道与I的区别仅仅是这里是一个循环数组。也就是说,单调栈遍历一遍后并不能 遍历完全部,应当遍历两遍,如第一遍遍历到头则继续向前遍历。

这里可以使用索引取余的方式来实现逻辑上的遍历两次:同时使用单调栈存索引而并非存值,方便存答案,避免重复元素覆盖问题。

根据上图,当第一次遍历完时,1、2、3、都已确定下一个最大。末尾3还不能确定。通过索引方式可以模拟继续向前遍历,则遍历到前段的那个3,根据单调栈回退,删去1、2、3索引,找到下一个最大元素4

cpp 复制代码
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        
        int n = nums.size();
        vector<int> res(n, -1);
        vector<int> st; // 单调栈:存索引;从栈顶到栈底依次递增。

        for (int i = 2*n - 1; i >= 0; --i) {
            int idx = i % n;
            //由于单调栈用于存索引,因此nums[st.back()]为栈中实际元素
            while (!st.empty() && nums[st.back()] <= nums[idx]) {
                st.pop_back();
            }
            //覆盖
            if (!st.empty()) {
                res[idx] = nums[st.back()];
            }

            st.push_back(idx);
        }

        return res;

    }
    
};
相关推荐
爱睡懒觉的焦糖玛奇朵5 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具使用说明】
人工智能·python·深度学习·学习·算法·yolo·音视频
Runawayliquor5 小时前
opbase:CANN 所有算子的公共地基
大数据·数据库·人工智能·算法
徐安安ye5 小时前
FlashAttention 为什么对序列长度这么“敏感”?
人工智能·算法
黎阳之光7 小时前
黎阳之光:以视频孪生重构智能监盘,为燃机打造新一代智慧电厂大脑
大数据·人工智能·算法·安全·数字孪生
绝知此事8 小时前
【算法突围 02】树形结构与数据库索引:树形结构与数据库索引:从 BST 到 B+ 树的演化与 MySQL 优化
数据库·mysql·算法·面试·b+树
清木!8 小时前
排序算法比较
数据结构·算法·排序算法
吴可可1239 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
汉克老师9 小时前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
灰灰勇闯IT10 小时前
ops-reduce:ReduceMax 与 ReduceMean 的并行优化
算法
水木流年追梦10 小时前
大模型入门-Reward 奖励模型训练
开发语言·python·算法·leetcode·正则表达式