具体思想:
注意一下全排列的思想,之前做过,后来忘了;
全排列+溢出判断;
这里说一全排列的思想;
如果想找下一个最小的大排列,实际上就是从后向前找第一对增序的元素;
例如:5,2,1,4,3;
找到1,4,3;
此时,除了1之外,后面的必定降序,所以从后向前搜索第一个大于1的元素,交换,得:
3.4.1;
此时可以看到,后半段仍然降序,所以只需要反转即可;
具体代码:
class Solution {
public:
void fun(string& s, int index) {
for (int i = s.size() - 1; i > index; i--) {
if (s[i] > s[index]) {
swap(s[i], s[index]);
break;
}
}
reverse(s.begin() + index+1, s.end());
}
int nextGreaterElement(int n) {
string s;
int first = -1;
int maxn = -1;//判断是否后续的元素都小于等于该元素;
while (n != 0) {
int num = n % 10;
s = char(num + '0')+s;
n /= 10;
}
bool flag = false;
for (int i = s.size(); i > 0; i--) {
if (s[i] > s[i - 1]) {
fun(s, i - 1);
flag=true;
break;
}
}
if (!flag)
return -1;
int ret = 0;
for (int i = 0; i < s.size(); i++) {
int num = s[i] - '0';
if (ret > INT_MAX / 10 || ret == INT_MAX / 10 && num > 7) {
return -1;
}
ret = ret * 10 + num;
}
return ret;
}
};