leetCode下一个排列解法
题目描述在此就不过多赘述了,大家可自行上leetcode查看
https://leetcode.cn/problems/next-permutation/
思路
-
首先判断特殊情况 输入数组恰巧为倒叙数组 则直接使用排序api 正序排列即可
-
除去以上的情况,其他大多数都是需要排列组合的,我这里采用的是从后往前遍历的方式 找到第一个正序排列的子序列
-
如图 图中红色圈中部分便是一个正序排列的子序列
-
找到2的下标 ,再找到最为合适的数进行替换
-
最后将余下的数值进行一个正序排列即刻
代码如下
public void nextPermutation2(int[] nums) {
int n = nums.length;
int k = n - 2;
// 找寻目标的下标值
while (k>=0 && nums[k] >= nums[k+1])
k--;
// 如果全部降序,以最小序列输出
if (k==-1){
Arrays.sort(nums);
return;
}
int i = k + 2;
while (i < n && nums[i] > nums[k])
i++;
// 比较替换
int temp = nums[i-1];
nums[i-1] = nums[k];
nums[k] = temp;
// 双指针法进行排序
int start = k+1;
int end = n-1;
while (start < end){
int tem = nums[start];
nums[start] = nums[end];
nums[end] = tem;
start++;
end--;
}
}