力扣链接:
https://leetcode-cn.com/probl...
解题思路:

  1. 第一次接触这个算法,没想到C++的STL库中就有next_permutation这个算法,用于计算下一个字典序列,这个算法自身也是十分精妙,没有其余额定的,记住这个算法就能够了
  2. 回归到题目自身,首先第一步就是从后往前遍历数组,找到第一个不为降序的数字,也就是对于下标i < i + 1; 有 a[i] > a[i+1];将此数记为a,此时i+1 ~ n-1的数字均为降序
  3. 持续从后往前遍历,找到第一个大于a[i]的数字,记为b
  4. 而后将a和b进行调换
  5. 从a+1到n此时为降序,能够应用二分翻转翻转数组,使其成为升序(也能够间接排序)
// 解题思路// 1、从后向前找到第一个非降序的数,即i < i+1 && a[i] < a[i+1]// 2、从后往前找到第一个大于a[i]的数a[j]// 3、替换a[i]和a[j],此时i+1~n肯定是降序的// 4、将i+1后的数字翻转排序func nextPermutation(nums []int)  {    n := len(nums)    i := n - 2    for i >= 0 && nums[i] >= nums[i+1] {        i--    }    if i >= 0 {        j := n-1        for j >= 0 && nums[i] >= nums[j] {            j--        }        nums[i], nums[j] = nums[j], nums[i]    }    reverse(nums[i+1:])}func reverse(nums []int) {    for i, n := 0, len(nums); i < n / 2; i++ {        nums[i], nums[n-1-i] = nums[n-1-i], nums[i]    }}