列表

详情


31. 下一个排列

整数数组的一个 排列  就是将其所有成员以序列或线性顺序排列。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

给你一个整数数组 nums ,找出 nums 的下一个排列。

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

 

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

 

提示:

相似题目

全排列

全排列 II

排列序列

回文排列 II

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: void nextPermutation(vector<int>& nums) { } };

golang 解法, 执行用时: 4 ms, 内存消耗: 2.5 MB, 提交时间: 2020-11-10 11:12:25

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

    sort.Ints(nums[i+1:length])
}

golang 解法, 执行用时: 4 ms, 内存消耗: 2.5 MB, 提交时间: 2020-11-10 11:08:44

func nextPermutation(nums []int)  {
    length := len(nums)
    i := length - 2
    for {
        if i >= 0 && nums[i] >= nums[i+1] {
            i--
        } else {
            break
        }
    }
    if i >= 0 {
        j := length - 1
        for {
            if j >= 0 && nums[i] >= nums[j] {
                j--
            } else {
                break
            }
        }
        nums[i], nums[j] = nums[j], nums[i]
    }

    left, right := i + 1, length-1
    for {
        if left < right {
            nums[left], nums[right] = nums[right], nums[left]
            left++
            right-- 
        } else {
            break
        }
    }
}

python3 解法, 执行用时: 40 ms, 内存消耗: 13.5 MB, 提交时间: 2020-11-10 10:32:23

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        i = len(nums) - 2
        # 从右向左遍历, 找到第一个升序数字(左边比右边小)i
        while i >= 0 and nums[i] >= nums[i + 1]:
            i -= 1
        if i >= 0:
            j = len(nums) - 1
            # 从右向左在升序索引[length:i]之间, 找到第一个比i大的j
            while j >= 0 and nums[i] >= nums[j]:
                j -= 1
            nums[i], nums[j] = nums[j], nums[i]  # 交换i/j
        
        # 对[i+1:length] 升序排列
        left, right = i + 1, len(nums) - 1
        while left < right:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1

上一题