LeetCode 556. 下一个更大元素III(线性扫描)

写在前面:我写博客主要是为了对知识点的总结、回顾和思考,把每篇博客写得通俗易懂是我的原则,因为能让别人看懂,才是真的学会了

从Math到CS的跨专业经历,让我格外珍惜学习时间,更加虚心好学,而分享技术和知识是快乐的,非常欢迎大家和我一起交流学习,期待与您的进一步交流

题目描述

原题链接
在这里插入图片描述

算法

(线性扫描) O ( n ) O(n)

  • 把n转为为字符串s,然后从后往前看,找到第一个下降的位置 i i ,然后让再从后往前找到第一个比 i i 位置的值大的数,交换这两个位置,再逆序 i i 后面的区间
  • 具体实例解释
n: 12544321
n: 12|544321
从后往前看第一个严格下降的数是2
然后再从后往前看第一个比2大的数是3
于是交换23
得到13|544221
最后逆序544221这一段

得到最终答案13122445

时间复杂度是 O ( n ) O(n) :最多扫描两次字符串,空间复杂度是 O ( n ) O(n)

代码

class Solution {
public:
    int nextGreaterElement(int n) {
        string s = to_string(n);
        string res = "";
        n = s.size();
        int i;
        bool flag = false;
        for (i = n - 2; i >= 0; i --) {
        	// find the first decrease position
            if (s[i] < s[i + 1]) {
                for(int j = n - 1; j > i; j --) {
                    if (s[j] > s[i]) {
                        swap(s[j], s[i]);
                        string tmp = s.substr(i + 1, n - i + 1);
                        reverse(tmp.begin(), tmp.end());
                        res = s.substr(0, i + 1) + tmp;
                        flag = true;
                        break;
                    }
                }
                if (flag) break;
            }
        }

        // if input is 1999999999, the next greater element is invalid
        if (i == -1 || (res.size() >= 10 && res[0] >= '2')) return -1;
        int ans = stoi(res);
        
        return ans;
    }
};
发布了239 篇原创文章 · 获赞 80 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_43827595/article/details/104210647