一、题目描述
二、解题思路
1.反向遍历当前排列,比如 排列A=[a,b,c,d,e,f...] ,当遍历到e时,说明以 a,b,c,d,e为前缀的排列中不存在A排列的下一个排列。
2.把e(位置设为idx)和后面的元素作比较:
2.1 如果有大于e的元素,找出这些里面最小的数,跟e交换位置;将 [idx,length-1] 位置元素升序排序,得到的排列就是A的下一排列。
2.2 如果没有则继续反向遍历。
3.当反向遍历完成并且没有发生元素位置交换时,说明没有排列A的下一个排列,将A排列元素从头到尾升序排序返回。
三、代码实现
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型一维数组
*/
public int[] nextPermutation (int[] nums) {
if(nums.length<=1){
return nums;
}
//从数组后面往前找
int fidx=0,sidx=0;
for(int i=nums.length-2;i>=0;i--){
int nownum=nums[i];
int overnownum=9999;
for(int j=i+1;j<nums.length;j++){
if(nums[j]>nownum){
if(overnownum>nums[j]){
overnownum=nums[j];
sidx=j;
}
}
}
if(overnownum!=9999){//说明找到大于当前第i个位置的最小值了
fidx=i;
break;
}
}
if(fidx!=0){//将fidx和sidx数值交换
int tmpnum=nums[fidx];
nums[fidx]=nums[sidx];
nums[sidx]=tmpnum;
fidx++;
}
//因为fidx=0时表示没有找到最大的数组排列,所以fidx=0恰好是对整个数组进行升序排序
//从fidx排序(这里使用选择排序)
for(int idx=fidx;idx<nums.length-1;idx++){
int nownum=nums[idx];
int minidx=9999;
for(int pdx=fidx+1;pdx<nums.length;pdx++){
if(nownum>nums[pdx]){
minidx=pdx;
nownum=nums[pdx];
}
}
if(minidx!=9999){
nums[minidx]=nums[fidx];
nums[fidx]=nownum;
}
}
return nums;
}
}
四、刷题链接
下一个排列_牛客题霸_牛客网