题目描述:按字典序输出下一个排列
解题思路:应该从后往前考虑,如果整个数组从大到小排好序,那么对此数组进行倒转后输出;遇到第一个比之后的数字小的数,应该在之后的数里面选取一个大于它的最小值放在这个位置,然后对右边的数排序
public class Solution { public void NextPermutation(int[] nums) { if (nums.Length <= 1) return; int i = nums.Length - 1; int j = nums.Length - 2; while (j >= 0) { if (nums[j] < nums[i]) { int k = i; while (k<nums.Length&&nums[k] > nums[j]) k++; k--; int temp = nums[j]; nums[j] = nums[k]; nums[k] = temp; Reverse(ref nums,i, nums.Length - 1); break; } i--; j--; } if (j < 0) { Reverse(ref nums, 0, nums.Length - 1); } } private void Reverse(ref int[] nums, int m, int n) { while (m <= n) { int temp2 = nums[m]; nums[m] = nums[n]; nums[n] = temp2; m++; n--; } } }