503. 下一个更大元素 II

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

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

示例 1:

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

示例 2:

复制代码
输入: nums = [1,2,3,4,3]
输出: [2,3,4,-1,4]

提示:

  • 1 <= nums.length <= 104
  • -109 <= nums[i] <= 109
cpp 复制代码
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        //环形解决办法1、在末尾多拼接一个nums
        int size = nums.size();
        nums.resize(2*nums.size());
        for(int i = size;i < nums.size();i++){
            nums[i] = nums[i-size];
        }

        //然后进行对nums单调栈操作,维护一个递增栈
        stack<int>st;
        st.push(0);
        vector<int>res(nums.size(),-1);
        vector<int>ans(nums.size(),-1);

        for(int i = 1;i < nums.size();i++){
            if(nums[i] < nums[st.top()]) st.push(i);
            else if(nums[i] == nums[st.top()]) st.push(i);
            else{
                while(!st.empty() && nums[i] > nums[st.top()]){
                    res[st.top()] = i-st.top();
                    st.pop();
                }
                st.push(i);
            }
        }
        for(int i = 0;i < nums.size();i++){
            if(res[i] != -1) ans[i] = nums[i+res[i]];
        }
        ans.resize(size);
        return ans;
    }
};
cpp 复制代码
class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        //环形解决办法1、在末尾多拼接一个nums
        //2、对遍历进行取模运算

        //然后进行对nums单调栈操作,维护一个递增栈
        stack<int>st;
        st.push(0);
        vector<int>res(nums.size(),-1);
        vector<int>ans(nums.size(),-1);

        for(int i = 1;i < 2*nums.size();i++){
            if(nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size());
            else if(nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size());
            else{
                while(!st.empty() && nums[i % nums.size()] > nums[st.top()]){
                    res[st.top()] = nums[i % nums.size()];
                    st.pop();
                }
                st.push(i % nums.size());
            }
        }
        return res;
    }
};
相关推荐
Farewell_me14 分钟前
C++模拟实现list:list、list类的初始化和尾插、list的迭代器的基本实现、list的完整实现、测试、整个list类等的介绍
c++·list
shark-chili16 分钟前
数据结构与算法-Trie树添加与搜索
java·数据结构·算法·leetcode
hong1616881 小时前
VSCode中配置C/C++环境
c语言·c++·vscode
小羊在奋斗1 小时前
【C++】探秘二叉搜索树
c++·人工智能·神经网络·机器学习
白葵新1 小时前
PCL addLine可视化K近邻
c++·人工智能·算法·计算机视觉·3d
seanli10081 小时前
线性dp 总结&详解
算法·动态规划
小丁爱养花1 小时前
记忆化搜索专题——算法简介&力扣实战应用
java·开发语言·算法·leetcode·深度优先
MustardJim2 小时前
Visual Studio 引入外部静态库与动态库
c++·visual studio
挽月0012 小时前
C++单例模式
开发语言·c++·单例模式
机器视觉知识推荐、就业指导2 小时前
Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)
c++·qt·tcp/ip