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%的用户
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!