Leetcode专题[数组]-31-下一个排列

力扣链接:
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]
    }
}

你可能感兴趣的:(golang)