题目描述
下一个更大元素 III
给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。
示例 1:
输入: 12
输出: 21
示例 2:
输入: 21
输出: -1
思路
比如“2 2 3 6 9 8 7 4 2”
首先是要从后往前操作,从个位开始操作,变化小一点,才能找到比当前数大的最小的那个数
然后,从后往前走,只要后面的数比前面的小就一直走,走不动为止;这样,我们就走了“9 8 7 4 2”这部分,它已经是局部最大了,调整不了了;
这样,问题就变成了如何调整“6 9 8 7 4 2 ”
从9开始往后找,找到大于6的最小值7,交换6,7;
变成“7 9 8 6 4 2”
再把“9 8 6 4 2”逆转,变成“7 2 4 6 8 9”
第一次做的时候都有啥问题
边界处理要把握好
感觉每次这种处理就要出错,干脆画个图好了0.0
初始化k:
终止条件
s[k]>s[k-1]
所以循环这样写:
while(不满足终止条件){
k–;
}
特殊处理:
所以特殊处理这样写
if(k==0) return -1;
然后定义t为 要和k-1交换的那个坐标,那么t肯定是从k开始的
那么循环的终止条件是什么?
是s[t]>s[k-1]还是s[t+1]<s[k-1]?
是终止状态和非终止状态的区别!
所以是后面的!!
还有 reverse(s.begin()+k,s.end());是逆转哪一部分的?
你代入一下k=0看看就知道啦
题解
class Solution {
public:
int nextGreaterElement(int n) {
string s=to_string(n);
int k=s.size()-1;
while(k>0&&s[k-1]>=s[k]) k--;
if(k==0) return -1;
int t=k;
while(t+1<s.size()&&s[t+1]>s[k-1]) t++;
swap(s[t],s[k-1]);
reverse(s.begin()+k,s.end());
long long res=stoll(s);
if(res>INT_MAX) return -1;
return res;
}
};