給你一個(gè)正整數(shù) n ,請你找出符合條件的最小整數(shù)缆镣,其由重新排列 n 中存在的每位數(shù)字組成芽突,并且其值大于 n 。如果不存在這樣的正整數(shù)董瞻,則返回 -1 寞蚌。
注意 ,返回的整數(shù)應(yīng)當(dāng)是一個(gè) 32 位整數(shù) 钠糊,如果存在滿足題意的答案挟秤,但不是 32 位整數(shù) ,同樣返回 -1 抄伍。
示例 1:
輸入:n = 12
輸出:21
示例 2
輸入:n = 21
輸出:-1
提示:
- 1 <= n <= 231 - 1
方法一:下一個(gè)排列
把 轉(zhuǎn)換成字符串(字符數(shù)組)艘刚,那么本題實(shí)際上是在求字符數(shù)組的 31. 下一個(gè)排列,當(dāng)不存在下一個(gè)排列時(shí)?1截珍。
public int nextGreaterElement(int n) {
char[] nums = Integer.toString(n).toCharArray();
int i = nums.length - 2;
while (i >= 0 && nums[i] >= nums[i + 1]) {
i--;
}
if (i < 0) {
return -1;
}
int j = nums.length - 1;
while (j >= 0 && nums[i] >= nums[j]) {
j--;
}
swap(nums, i, j);
reverse(nums, i + 1);
long ans = Long.parseLong(new String(nums));
return ans > Integer.MAX_VALUE ? -1 : (int) ans;
}
public void reverse(char[] nums, int begin) {
int i = begin, j = nums.length - 1;
while (i < j) {
swap(nums, i, j);
i++;
j--;
}
}
public void swap(char[] nums, int i, int j) {
char temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/next-greater-element-iii
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有攀甚。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán)箩朴,非商業(yè)轉(zhuǎn)載請注明出處。