/**
* 31. 下一个排列
* @author wsq
* @date 2020/11/10
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
链接:https://leetcode-cn.com/problems/next-permutation
*/
package com.wsq.leetcode;
import java.util.Arrays;
public class NextPermutation {
/**
* 做题一定要尝试自己拿笔去推敲下
* 由于这道题是寻找下一个最大的排列,因此改动的位置应该从个、十、百、千,从右向左去改变
* 1.n-2作为起始更换的位置
* 2. 从n-2+1到n寻找最小的大于n-2对应元素的元素位置
* 3. 更换所找到的元素位置,将两个位置对应元素互换
* 4.针对n-2+1的元素实施升序排序
* 5.n-2到0重复以上操作,如果中间有一个位置满足,直接跳出循环,结束
* @param nums
*/
public void nextPermutation(int[] nums) {
int n = nums.length;
if(n == 1){
return;
}
int i = n - 2;
while(i >= 0){
int max = -1;
for(int j = i + 1; j < n; j++){
if(max == -1){
if(nums[j] > nums[i]){
max = j;
}
}else{
if(nums[j] < nums[max] && nums[j] > nums[i]){
max = j;
}
}
}
if(max != -1){
int tmp = nums[max];
nums[max] = nums[i];
nums[i] = tmp;
Arrays.sort(nums, i + 1, n);
return;
}
i--;
}
Arrays.sort(nums);
}
}
31. 下一个排列
最新推荐文章于 2024-06-05 20:12:25 发布