- 算法
- 1.首先找到最大的i使得nums[i]<nums[i+1]
- 2.如果没有这样的i,当前排列是字典序最大的排列,翻转整个数组即是下一个排列
- 3.如果找到这样的i,接着找到最大的j使得nums[j]>nums[i]
- 4.交换i和j,再翻转数组的[i+1, n-1]部分即是下一个排列
public void nextPermutation(int[] nums) { int n = nums.length; int i = 0; for (i = n - 2; i >= 0; i--) { if (nums[i] < nums[i+1]) { break; } } if (i < 0) { reverse(nums, 0, n-1); } else { int j = 0; for (j = n - 1; j > i; j--) { if (nums[j] > nums[i]) { break; } } swap(nums, i, j); reverse(nums, i + 1, n - 1); } } private void swap(int[] nums, int x, int y) { int temp = nums[x]; nums[x] = nums[y]; nums[y] = temp; } private void reverse(int[] nums, int start, int end) { for (int i = start, j = end; i < j; i++, j--) { int temp = nums[i]; nums[i] = nums[j]; nums[j] = temp; } }
func nextPermutation(nums []int) { n := len(nums) i := 0 for i = n - 2; i >= 0; i-- { if nums[i] < nums[i+1] { break; } } if i < 0 { reverse(nums, 0, n-1) } else { j := 0 for j = n - 1; j > i; j-- { if nums[j] > nums[i] { break; } } nums[i], nums[j] = nums[j], nums[i] reverse(nums, i+1, n-1) } } func reverse(nums []int, start, end int) { for i, j := start, end; i < j; i += 1 { nums[i], nums[j] = nums[j], nums[i] j-- } }