题目地址:
https://leetcode.com/problems/next-greater-element-iii/
给定一个正整数 n n n,要求返回一个最小的、数字构成与之完全一样并且比 n n n大的数。如果不存在,或者超出了 2 31 − 1 2^{31}-1 231−1就返回 − 1 -1 −1。
由于两个正整数的比较大小实际上就是按字典序比较的,所以这题做法和找到下一个全排列一模一样,参考https://blog.csdn.net/qq_46105170/article/details/108460153。代码如下:
class Solution {
public:
using ll = long long;
int nextGreaterElement(int n) {
string s = to_string(n);
int i = s.size();
while (i && s[i] <= s[i - 1]) i--;
if (!i) return -1;
int l = i, r = s.size() - 1;
while (l < r) {
int mid = l + (r - l + 1 >> 1);
if (s[mid] > s[i - 1]) l = mid;
else r = mid - 1;
}
swap(s[i - 1], s[l]);
reverse(s.begin() + i, s.end());
ll res = stol(s);
if (res > INT_MAX) return -1;
return (int) res;
}
};
时空复杂度 O ( log n ) O(\log n) O(logn)。