问题描述
给定一个32位正整数 n,你需要找到最小的32位整数,其与n中存在的位数瓦全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。
解题报告
该题与 Leetcode 31. 下一个排列 非常类似,只不过该题中,如果下一个排列小于当前数或者超过了最大的32位整数,则返回-1;
注意: reverse()会将区间[beg,end)内的元素全部逆序,前闭后开区间
实现代码
class Solution {
public:
int nextGreaterElement(int n) {
vector<int>nums;
int tmpN=n;
while(n){
nums.push_back(n%10);
n/=10;
}
int i=1,j;
while (i<nums.size()&&nums[i-1]<=nums[i])i++;
if (i<nums.size()) {
j=upper_bound(nums.begin(), nums.begin()+i-1,nums[i])-nums.begin();
swap(nums[i],nums[j]);
}
reverse(nums.begin(), nums.begin()+i);
long ans=0;
for(int i=nums.size()-1;i>=0;i--)ans=ans*10+nums[i];
return (ans<=tmpN||ans>INT_MAX)?-1:ans;
}
};