LeetCode556. 下一个更大元素 III
题目描述
本题目来自LeetCode上的『556. 下一个更大元素 III』
给你一个正整数 n
,请你找出符合条件的最小整数,其由重新排列 n
中存在的每位数字组成,并且其值大于 n
。如果不存在这样的正整数,则返回 -1
。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1
。
示例1:
输入:n = 12
输出:21
提示
1 <= n <= 2^31 - 1
题解
本题与『31. 下一个排列』 是一样的题。
具体题解可以看 『31. 下一个排列题解』
注意判断排列是否存在以及是否溢出。
代码
class Solution {
public:
int nextGreaterElement(int n) {
string s = to_string(n);
int len = s.size();
int i = len - 2;
for (; i >= 0 && s[i] >= s[i + 1]; --i) {}
if (i < 0) {
return -1;
}
int j = len - 1;
for (; j >= 0 && s[i] >= s[j]; --j) {}
swap(s[i], s[j]);
reverse(s.begin() + i + 1, s.end());
long ans = stol(s);
return ans > INT_MAX ? -1 : ans;
}
};
直接STL(跑
class Solution {
public:
int nextGreaterElement(int n) {
string s = to_string(n);
return !next_permutation(s.begin(), s.end()) || stol(s) > INT_MAX ? -1 : stoi(s);
}
};
复杂度分析
- 时间复杂度:$O(\log{n})$
- 空间复杂度:$O(\log{n})$