实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3] 输出:[1,3,2]
示例 2:
输入:nums = [3,2,1] 输出:[1,2,3]
示例 3:
输入:nums = [1,1,5] 输出:[1,5,1]
示例 4:
输入:nums = [1] 输出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
答案:
func nextPermutation(nums []int) {
if nums == nil || len(nums) == 1 {
return
}
//从右往左找到大于左边的数字的下标
maxIndex := 0
for i := len(nums) - 1; i > 0; i-- {
if nums[i-1] < nums[i] {
maxIndex = i
break
}
}
//从右往左查找最先大于maxIndex位置数的index
if maxIndex != 0 {
tempIndex := -1
for i := len(nums) - 1; i >= maxIndex; i-- {
if nums[i] > nums[maxIndex-1] {
tempIndex = i
break
}
}
//交换maxIndex和tempIndex位置的数,再将maxIndex位置后的数
nums[maxIndex-1] = nums[maxIndex-1] ^ nums[tempIndex]
nums[tempIndex] = nums[maxIndex-1] ^ nums[tempIndex]
nums[maxIndex-1] = nums[maxIndex-1] ^ nums[tempIndex]
}
//上述操作后,maxIndex->len(nums)区间是降序排列,翻转为升序
for i := 0; i <= (len(nums)-maxIndex)/2-1; i++ {
nums[maxIndex+i] = nums[maxIndex+i] ^ nums[len(nums)-1-i]
nums[len(nums)-1-i] = nums[maxIndex+i] ^ nums[len(nums)-1-i]
nums[maxIndex+i] = nums[maxIndex+i] ^ nums[len(nums)-1-i]
}
}