【LeetCode】31. Next Permutation 解题报告(Python)

题目分析:

这一题是让我们返回一个恰好大于给定序列的数的序列,如果找不到(即原序列是最大的)就倒序返回。
例子:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

代码说明:

上面的例子较短不容易找到规律,如果给定序列:1  2  7  4  3  1,那么结果应该是1  3  1  2  4  7。
变换过程如下:
1  2   7  4  3  1

1  2  7  4  3  1

1  3  7  4  2  1

1  3  1  2  4  7

  1. 因为是找更大的数,那么从后往前看一定是递增的,找到一个突然变小的位置标记如,上面的2
  2. 找到后从变小的位置向后是递减的,因为要恰好大于,那就找到一个恰好大于它的数,上面的3
  3. 互相交换位置
  4. 从原来变小的位置(例子中的2)后面倒序,这个结果就是恰好大于原来的序列

代码中已有注释,不再详细解释

测试代码:

class Solution:
    def nextPermutation(self, nums):
        #length记录数组长度,l用来循环
        length = l = len(nums)
        #记录是否进入循环,如果没有证明是最大的,直接反序
        flag = True
        while(l >= 2):
            #倒序寻找一个前一个小于后一个的位置,用于交换
            if nums[l - 1] > nums[l - 2]:
                flag = False
                left = l - 2
                right = -1
                #寻找一个刚好大于我们要交换的数
                for i in range(l-1, length):
                    if nums[l-2] >= nums[i]:
                        right = i - 1
                        break
                #交换
                nums[left], nums[right] = nums[right], nums[left]
                #后半段反序
                nums[left+1: length] = list(reversed(nums[left+1: length]))
                break
            l -= 1
        #如果没有进入循环证明是最大的,直接反序
        if flag:    nums.reverse()


        print(nums)    #提交时请删除该行
Solution().nextPermutation([1, 2, 7, 4, 3, 1])  #提交时请删除该行

参考文章

猜你喜欢

转载自blog.csdn.net/L141210113/article/details/88366954