• 算法
    • 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--
    }
}