0
点赞
收藏
分享

微信扫一扫

LeetCode-031-下一个排列

酷子腿长一米八 2021-09-28 阅读 73
LeetCode

下一个排列

解法一:遍历数组
import java.util.Arrays;

public class LeetCode_031 {
public static void nextPermutation(int[] nums) {
// 如果数组为空,或者数组的长度为0或者只有一个元素,不用处理
if (nums == null || nums.length < 2) {
return;
}
// 是否找到更大的排列
boolean handled = false;
// 首先找到需要调换位置的数字
int left = -1, right = -1;
for (int i = nums.length - 1; i > 0; i--) {
for (int j = i - 1; j >= 0; j--) {
if (nums[i] > nums[j]) {
if (j > left) {
left = j;
right = i;
} else if (j == left) {
if (i == right) {
left = j;
right = i;
}
}
handled = true;
break;
}
}
}

if (handled) {
// 找到更大的排列
// 1.将 right 的数字和 left 的数字调换位置
exch(nums, left, right);
// 2.首先将 right+1 后面的数字倒排
for (int x = right + 1; x < (nums.length + right + 1) / 2; x++) {
exch(nums, x, nums.length - 1 - (x - right) / 2);
}
// 3.然后将 left+1到right-1 之间的数字跟 right+1到nums.length-1 的数字整体调换顺序
for (int x = right - 1; x >= left + 1; x--) {
for (int y = x; y < nums.length - 1; y++) {
exch(nums, y, y + 1);
}
}
// 4.然后将 left+1 位置的数字移到小于它的数字之后
for (int x = left + 1; x < nums.length - 1; x++) {
if (nums[x] > nums[x + 1]) {
exch(nums, x, x + 1);
} else {
break;
}
}
} else {
// 如果handled为false,说明没有更大的排列,也就是不存在下一个更大排列,将数字重新排列成最小的排列,
// 就是将顺序倒排
for (int i = 0; i < nums.length / 2; i++) {
exch(nums, i, nums.length - 1 - i);
}
}
}

private static void exch(int[] nums, int left, int right) {
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
}

public static void main(String[] args) {
int[] nums = new int[]{4, 2, 0, 2, 3, 2, 0};
System.out.println("=====处理前=====");
Arrays.stream(nums).forEach(num -> {
System.out.print(num + " ");
});
System.out.println();
System.out.println("=====处理后=====");
nextPermutation(nums);
Arrays.stream(nums).forEach(num -> {
System.out.print(num + " ");
});
}
}
举报

相关推荐

0 条评论