题目:
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
- 输入:nums = [1,2,3]
- 输出:[1,3,2]
示例 2:
- 输入:nums = [3,2,1]
- 输出:[1,2,3]
示例 3:
- 输入:nums = [1,1,5]
- 输出:[1,5,1]
示例 4:
- 输入:nums = [1]
- 输出:[1]
java:
public static void nextPermutation(int[] nums) {
for (int i = nums.length - 1; i >= 0; i--) {
for (int j = nums.length - 1; j > i; j--) {
if (nums[j] > nums[i]) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
Arrays.sort(nums, i + 1, nums.length);
return;
}
}
}
Arrays.sort(nums);
}
public static void nextPermutation2(int[] nums) {
int index = findIndex(nums);
if (index != 0) {
exchange(nums, index);
}
reverse(nums,index);
}
private static void reverse(int[] nums, int index) {
for (int i = index, j = nums.length - 1; i < j; i++, j--){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
private static void exchange(int[] nums, int index) {
int head = nums[index - 1];
for (int i = nums.length - 1; i > 0; i--) {
if (head < nums[i]) {
nums[index - 1] = nums[i];
nums[i] = head;
break;
}
}
}
private static int findIndex(int[] nums) {
for (int i = nums.length - 1; i > 0; i--) {
if (nums[i] > nums[i - 1]) {
return i;
}
}
return 0;
}
public static void main(String[] args) {
int[] nums = {3, 2, 1};
nextPermutation(nums);
for (int i = 0; i < nums.length; i++) {
System.out.println(nums[i]);
}
int[] nums2 = {1,2,3};
nextPermutation2(nums2);
for (int i = 0; i < nums2.length; i++) {
System.out.println(nums[i]);
}
}
}
Go:
func NextPermutation(array []int) {
for i := len(array) - 1; i >= 0; i-- {
for j := len(array) - 1; j >= i; j-- {
if array[j] > array[i] {
array[j], array[i] = array[i], array[j]
reverse(array, 0+i+1, len(array)-1)
return
}
}
}
reverse(array, 0, len(array)-1)
}
func reverse(array []int, begin, end int) {
for i, j := begin, end; i < j; i, j = i+1, j-1 {
array[i], array[j] = array[j], array[i]
}
}
一曲定重楼.一眼半生筹.
如果大家喜欢我的分享的话.可以关注我的微信公众号
念何架构之路