题目链接
题目描述
给你一个正整数 n
,请你找出符合条件的最小整数,其由重新排列 n
中存在的每位数字组成,并且其值大于 n
。如果不存在这样的正整数,则返回 -1
。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1
。
示例 1:
输入: n = 12
输出: 21
示例 2:
输入: n = 21
输出: -1
提示:
-
解题思路
方法一:排序
class Solution {
public int nextGreaterElement(int n) {
String s = String.valueOf(n);
char[] arr = s.toCharArray();
int len = arr.length;
int i;
// 找到arr[i-1] < arr[i]
for(i = len - 1; i > 0; --i){
if(arr[i] > arr[i - 1]){
break;
}
}
if(i > 0 && arr[i] > arr[i - 1]){
int pos = i;
// 找到大于arr[i-1]的最小值
for(int j = i; j < len; ++j){
if(arr[j] < arr[pos] && arr[j] > arr[i - 1]){
pos = j;
}
}
// 交换
char tmp = arr[pos];
arr[pos] = arr[i - 1];
arr[i - 1] = tmp;
}else{
return -1;
}
// i-1后面的从小到大排序
char[] tmpArr = new char[len - i];
for(int j = 0; j < tmpArr.length; ++j){
tmpArr[j] = arr[j + i];
}
Arrays.sort(tmpArr);
for(int j = 0; j < tmpArr.length; ++j){
arr[j + i] = tmpArr[j];
}
long res = 0;
for(char c : arr){
res = res * 10 + c - '0';
if(res > Integer.MAX_VALUE){
return -1;
}
}
return (int)res;
}
}
时间复杂度 O(m^2n)
- 空间复杂度 O(mn)