力扣链接:
https://leetcode-cn.com/probl...
解题思路:
- 第一次接触这个算法,没想到C++的STL库中就有next_permutation这个算法,用于计算下一个字典序列,这个算法自身也是十分精妙,没有其余额定的,记住这个算法就能够了
- 回归到题目自身,首先第一步就是从后往前遍历数组,找到第一个不为降序的数字,也就是对于下标i < i + 1; 有 a[i] > a[i+1];将此数记为a,此时i+1 ~ n-1的数字均为降序
- 持续从后往前遍历,找到第一个大于a[i]的数字,记为b
- 而后将a和b进行调换
- 从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] }}