模板
从后往前找到第一次降序的位置,将这个点换成比之前大的最小数,将后面的数字转变为尽量小(转化为升序)。
class Solution {
public void nextPermutation(int[] nums) {
int n=nums.length;
int k=nums.length-1;
while(k>0&&nums[k-1]>=nums[k]) k--;
if(k<=0){
reverse(nums,0,n-1);
}
else{
int t=k;
while(t<n&&nums[t]>nums[k-1]) t++;
int temp=nums[t-1];
nums[t-1]=nums[k-1];
nums[k-1]=temp;
reverse(nums,k,n-1);
}
}
public void reverse(int[] nums,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
下一个排列(LeetCode31)
class Solution {
public void nextPermutation(int[] nums) {
int n=nums.length;
int k=nums.length-1;
while(k>0&&nums[k-1]>=nums[k]) k--;
if(k<=0){
reverse(nums,0,n-1);
}
else{
int t=k;
while(t<n&&nums[t]>nums[k-1]) t++;
int temp=nums[t-1];
nums[t-1]=nums[k-1];
nums[k-1]=temp;
reverse(nums,k,n-1);
}
}
public void reverse(int[] nums,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}
下一个更大的子序列|||(LeetCode556)
class Solution {
public int nextGreaterElement(int x) {
int[] nums=returnArray(x);
int n=nums.length;
int k=nums.length-1;
while(k>0&&nums[k-1]>=nums[k]) k--;
if(k<=0){
reverse(nums,0,n-1);
}
else{
int t=k;
while(t<n&&nums[t]>nums[k-1]) t++;
int temp=nums[t-1];
nums[t-1]=nums[k-1];
nums[k-1]=temp;
reverse(nums,k,n-1);
}
int res=0,a=1;
for(int i=n-1;i>=0;i--){
res+=nums[i]*a;
a*=10;
}
return res>x?res:-1;
}
public int[] returnArray(int n){
String s=Integer.toString(n);
int len=s.length();
int[] nums=new int[len];
for(int i=0;i<len;i++){
nums[i]=s.charAt(i)-'0';
}
return nums;
}
public void reverse(int[] nums,int start,int end){
for(int i=start,j=end;i<j;i++,j--){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}
}