【leetcode刷题】31. Next Permutation

原题链接
https://leetcode.com/problems/next-permutation/
解题思路
从后往前先找出第一对为升序的数字,使flag指向第一个数;再从后往前开始遍历,当nums[i]大于nums[flag]时,交换这两个数字,并break;最后将nums[flag+1:]倒过来,使它们变为从小到大的排序,在输出nums即可
在这里插入图片描述代码

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        if nums == [] or len(nums) == 1:
            return nums

        lastone = True
        flag = len(nums)-1

        for i in range(len(nums)-1, 0, -1): #标记flag
            if nums[i-1] < nums[i]:
                flag = i - 1
                break

        for i in range(len(nums)-1, flag, -1): #从后向前找出小于nums[flag]的元素
            if nums[i] > nums[flag]:
                tmp = nums[flag]
                nums[flag] = nums[i]
                nums[i] = tmp
                lastone = False
                break

        if lastone == True: #如果是最后一个直接倒置
            return nums[::-1]

        nums[flag+1:] = nums[flag+1:][::-1] #将flag后的序列倒转为由小到大排列的序列
        return nums

参考链接
https://www.cnblogs.com/zuoyuan/p/3780167.html

猜你喜欢

转载自blog.csdn.net/weixin_39746008/article/details/88875916