题目:
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。
示例 1:
输入:n = 12
输出:21
示例 2:
输入:n = 21
输出:-1
提示:
1 <= n <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/next-greater-element-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
转换成字符串后,从后往前找,找到第一个比后面的数小的数字(说明可以出现比原来更大的数了),为了使得到的数在比原来的数大的基础上尽可能小,找到后面比它大的最小数,从最后面往前找(因为从后往前一定是递增的),交换两者。但这样不一定是最小,需要将后面这部分排序,得到比原来数大的最小数。
代码:
class Solution {
public:
int nextGreaterElement(int n) {
string s = to_string(n);
for(int i = s.size() - 1; i > 0; i--) {
if(s[i] > s[i - 1]) {
for(int j = s.size() - 1;; j--){
if(s[j] > s[i - 1]) {
swap(s[i - 1], s[j]);
sort(s.begin() + i, s.end());
if(s.size() == to_string(INT_MAX).size() && s > to_string(INT_MAX))
return -1;
else
return stoi(s);
}
}
}
}
return -1;
}
};