力扣链接:
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]
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。