题目
https://leetcode-cn.com/problems/next-greater-element-iii/
思路
从右往左找到第一个升序的nums[i]<nums[i+1]
在nums[i]右边找到刚好大于它的数,与nums[i]交换
将num[i]后的数字都升序排列,保证后面部分的最小
代码
class Solution {
public int nextGreaterElement(int n) {
char[] nums=(""+n).toCharArray();//转成String再转为char数组
int len=nums.length;
int a=len-1;
while(a>=0&&a<len){
if(a+1<len&&nums[a]<nums[a+1]){//找到了符合条件的a
break;
}
a--;
}
//找不到,现在都是倒序,已经是最大的排列了
if(a<0){
return -1;
}
int b=len-1;
while(b>=0&&nums[b]<=nums[a]){//从右边找到大于a的b
b--;
}
//交换a,b
char tmp=nums[a];
nums[a]=nums[b];
nums[b]=tmp;
reverse(nums,a+1);
//转化为整数
try{
return Integer.parseInt(new String(nums));
}catch(Exception e){
return -1;
}
}
public void reverse(char[] nums,int start){
int end=nums.length-1;
while(start<end){
char tmp=nums[start];
nums[start]=nums[end];
nums[end]=tmp;
start++;
end--;
}
}
}