Golang:
思路:这题难度在于理解题意,什么叫下一个排列,简单来说,给定一个数组[1,2,3,4,5],我们可以把它看成一个整数12345,那么它的下一个排列也就是12354,即大于12345的最小的排列。解题过程就是,从后往前,找到非递增的第一个数,再从后往前,将它从它以后的大于它的第一个数交换,然后反转它后面的剩下的数组部分。举个比较有代表性的例子,[3,6,5,4,3],从后往前找到非递增的第一个数3,位置是arr[0],再从后往前,将它从它以后的大于它的第一个数(也就是4)交换,交换完以后,数组变成[4,6,5,3,3],可以看到,4后面的部分都是递减的,于是我们反转这些部分即可。
代码如下:
func nextPermutation(nums []int) {
if len(nums)<=1 {
return
}
i:=len(nums)-1
for i-1>=0&&nums[i-1]>=nums[i] {
i--
}
if i==0 {
reverse(nums)
}else{
for temp:=len(nums)-1;temp>=0;temp--{
if nums[temp]>nums[i-1] {
nums[temp],nums[i-1]=nums[i-1],nums[temp]
reverse(nums[i:len(nums)])
break
}
}
}
}
func reverse(arr []int) {
i,j:=0,len(arr)-1
for i<j {
arr[i],arr[j]=arr[j],arr[i]
i++
j--
}
}
有疑问加站长微信联系(非本文作者)