Leetcode 556. 下一个更大元素 III
题目
给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。
测试样例
示例 1:
输入: 12
输出: 21
示例 2:
输入: 21
输出: -1
题解
找到最后一次发生递减的位置,即num[i]>num[i-1],我们让l=i-1。然后让低位,也就是l+1~n有序,我们在l+1 ~ n中找到大于nums[l]的第一个数的下标minI,交换num[l],num[minI,便得到最终答案。详细过程见代码
代码
vector<int> getNum(int n){ //将数存到数组中
vector<int> ans;
while(n){
ans.push_back(n % 10);
n /= 10;
}
reverse(ans.begin(),ans.end());
return ans;
}
int nextGreaterElement(int n) {
vector<int> num = getNum(n);
int x = num.size();
int l = -1;
for(int i=1; i<x; i++){ //找到最后一个发生递减的位置
if(num[i]>num[i-1])
l = i-1;
}
if(l == -1) return -1;
reverse(num.begin()+l+1,num.end()); //使低位有序
int minI = upper_bound(num.begin()+l+1,num.end(),num[l])-num.begin();
swap(num[l],num[minI]);
long ans=0;
for(int i=0; i<x; i++){ //构造答案
ans = ans*10 + num[i];
}
return ans>INT_MAX ? -1 : ans;
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-greater-element-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。