AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 556. 下一个更大元素 III

作者: 作者的头像   tea321000 ,  2021-01-14 11:30:24 ,  阅读 3


0


class Solution {
public:
    int nextGreaterElement(int n) {
        #ifdef _commet
        这道题乍一看先入为主是单调栈题目,其实跟单调栈没啥太大关系,虽然也可以使用栈这个结构来做,但并没有什么优势。
        单调栈的优点在于遍历数组的同时输出或者用vector储存比当前遍历到的元素更大的下一个元素,而在此题中我们是要从右往左遍历,首先求得第一个递减的元素位置,
        然后将它与比它更大的最小数交换(如25432,2就是要找的这个位置,与比2更大的最小数3进行交换),最后再将右侧的序列翻转(即将3 5422转为3 2245),
        也就是说我们实际上要找的是比特定元素更大的元素,此时右侧序列虽然是单调的,但是并不能在初次遍历就将要求的结果输出或者储存
        (比如可能会出现265这种从右往左第一遍遍历时压根就找不到比2更大的数),因此并没有什么优势,跟自己
        从右往左再遍历一遍是一样的。当然,右侧序列第二次遍历从左往右遍历也是可以的,因为并不清楚找到的位置元素位于右侧序列的哪个位置,因此都是半斤八两。
        #endif
        stack<char> st;
        string s = to_string(n);
        int k=s.size()-1;
        while (k && s[k-1]>=s[k])
            k--;
        if(!k)
            return -1;
        for(int i=s.size()-1;i>=k;i--)
        {
            if(s[i]>s[k-1])
            {
                swap(s[k-1],s[i]);
                reverse(s.begin()+k,s.end());
                break;
            }
        }
        auto ans=stoll(s);
        if (ans > INT_MAX)
            return -1;
        return ans;

    }
};

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息