/**
1,2,3,4
1,2,4,3
1,3,2,4
1,3,4,2
1,4,2,3
1,4,3,2
2,1,3,4
2,1,4,3
2,3,1,4
2,3,4,1
...
4,3,2,1
从以上得到规律
解题思路
1. 从后往前找到第一个相邻升序的位置 i, i+1
2. 从后往前找到第一个比a[i]的大的数 k
3. 交换a[i] a[k]
4. 然后将i+1之后的位置,reverse
*/
func nextPermutation(nums []int) {
i, j, k := len(nums)-2, len(nums) - 1, len(nums) - 1
//从后往前找到第一个a[i] < a[j]的位置
for ;i>=0 && nums[i] >= nums[j]; {
i--
j--
}
if i >= 0 {
//从后往前找到第一个比a[i]大的数
for ;k>=0 && nums[k] <= nums[i]; {
k--
}
// 交换a[i] a[k]
nums[i], nums[k] = nums[k], nums[i]
}
// 然后将i+1之后的位置,reverse
for i, j := j, len(nums)-1; i<j; {
nums[i], nums[j] = nums[j], nums[i]
i++
j--
}
}
LeetCode 31. 下一个排列
最新推荐文章于 2024-07-16 23:15:32 发布