题目:下一个排列
题目描述:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
分析:很明显从后想前遍历,直到找到一个前面的数比后面的小,然后在他的后面找到他应该在的位置,将它后面的数全部交换。leetcode上官方结题,有个动态图解释的很清楚
代码:
func nextPermutation(nums []int) {
n:=len(nums)
i:=n-2
for i>=0 && nums[i+1]<=nums[i]{
i--
}
j:=n-1
if i>=0{
for j>=0 && nums[j]<=nums[i]{
j--
}
swap(nums,i,j)
}
j=n-1
i=i+1
for i<j{
swap(nums,i,j)
i++
j--
}
}
func swap(nums []int,i,j int){
temp:=nums[i]
nums[i]=nums[j]
nums[j]=temp
}