题目链接
题目描述
给你一个正整数 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)
