Implement next permutation,which rearanges numbers into the lexicographically next greater permutation of numbers.
if such arrangement is not possible ,it must rearrange it as the lowest possible order
code example:
static void nextPermutation(int[] nums)
{
nextPermutation(nums,0,nums.Length);
}
static bool nextPermutation(int[]nums,int begin,int end)
{
int p = end - 2;
while (p > -1 && nums[p] >= nums[p + 1]) --p;//检查是否为递减序列,找到非递减的角标
if (p == -1)//若整个序列为递减序列,则整体进行翻转即可
{
reverse(nums, begin, end);
return false;
}
int c = end - 1;
while (c > 0 && nums[c] <= nums[p]) --c;//检查翻转的角标值与后面的元素大小,若小于等于则继续检索,直到找到大于后面的元素
swap(nums,p,c);
reverse(nums, p + 1, end);
return true;
}
static void swap(int []nums,int i,int j)
{
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
static void reverse(int [] nums,int begin,int end)
{
end--;
while (begin < end)
{
swap(nums, begin++, end--);
}
}