31. 下一个排列

下一个排列

题目描述:

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

示例 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]

思路:

先从后往前找到第一个非降序的数字num[i],再从后往前找到一个比第一个非降序的数字小的数,然后交换,交换完之后把第一个非降序的数字i+1到len(nums)进行倒叙排列。

代码:

func nextPermutation(nums []int)  {
 if len(nums) <=1{
     return 
 }
 
 i,j,k := len(nums)-2, len(nums)-1, len(nums)-1
 for i>=0 &&nums[i] >=nums[j] {
     i--
     j--
 }
 if i>=0{
     for nums[k] <= nums[i]{
         k--
     }
     nums[k], nums[i] = nums[i], nums[k]
 }
for i,j = j,len(nums)-1; i<j; {
    nums[i],nums[j] = nums[j],nums[i]
    i++
    j--
 }
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2.2 MB, 在所有 Go 提交中击败了100.00%的用户