LeetCode31下一个排列
题目描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
思路:下一个个时什么数,其实可以发现只需要看后面一部分,也就是从后面往前看,一直升序,直到降序开始,然后把降序的那个数在后面找到刚比它打的数然后交换,再把后面的序列反转
比如 1234543210 从后面的数开始看也就是0,一直到5都是升序,就看5前面的4,从后面往前比4大的就只有5,4和5交换
变成 1235443210,然后443210反转变成 123501244
public class LeetCode_31 {
public static void main(String[] args) {
LeetCode_31 lc31=new LeetCode_31();
int nums[]= {3,2,1};
lc31.nextPermutation(nums);
for(int i=0;i<nums.length;i++) {
System.out.println(nums[i]);
}
}
public void nextPermutation(int[] nums) {
int p=0;
boolean bo=true;
for(int i=nums.length-1;i>0;i--) {
if(nums[i-1]<nums[i]) {
p=i-1;
break;
}
if(i==1) {
bo=false;
p=-1;
}
}
if(bo) {
for(int i=nums.length-1;i>0;i--) {
if(nums[i]>nums[p]) {
int t=nums[i];
nums[i]=nums[p];
nums[p]=t;
break;
}
}
}
f(nums,p+1);
}
void f(int nums[],int l) {
int r=nums.length-1;
while(l!=r&&l<r) {
int t=nums[l];
nums[l]=nums[r];
nums[r]=t;
l++;
r--;
}
}
}
一次就通过了