写在前面:我写博客主要是为了对知识点的总结、回顾和思考,把每篇博客写得通俗易懂是我的原则,因为能让别人看懂,才是真的学会了
从Math到CS的跨专业经历,让我格外珍惜学习时间,更加虚心好学,而分享技术和知识是快乐的,非常欢迎大家和我一起交流学习,期待与您的进一步交流
题目描述
算法
(线性扫描)
- 把n转为为字符串s,然后从后往前看,找到第一个下降的位置 ,然后让再从后往前找到第一个比 位置的值大的数,交换这两个位置,再逆序 后面的区间
- 具体实例解释
n: 12544321
n: 12|544321
从后往前看第一个严格下降的数是2
然后再从后往前看第一个比2大的数是3
于是交换2和3
得到13|544221
最后逆序544221这一段
得到最终答案13122445
时间复杂度是 :最多扫描两次字符串,空间复杂度是
代码
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;
}
};