[LeetCode]31. Next Permutation

31. Next Permutation

题意:计算下一个比当前排列构成的值要大的排列。

这有个算法:

  1. 找到最后一个升序的下标,如果不存在,则说明这个排列是升序的,此排列已经是最大的排列,那么直接反转即可,比如3,2,1的结果则为1,2,3;
  2. 找到最后一个比升序的下标的值还要大的下标,进行两两交换;
  3. 将升序下标以后的值都进行反转;

以1,2,3为例,执行过程如下:

1,3,2(最后一个升序下标为0,即1,最后一个比1要大的是2) -> 2,3,1 -> 2,1,3(反转)

import bisect
class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        # 1.从后面找到第一个升序的值
        k = -1
        for i in range(len(nums)-2, -1, -1):
            if nums[i] < nums[i+1]:
                k = i
                break
        # 说明是全是降序
        if k == -1:
            nums.reverse()
            return
        # 2.从后面找到第一个比k要大的值,交换
        l = -1
        for i in range(len(nums)-1, k, -1):
            if nums[i] > nums[k]:
                l = i
                break
        nums[l], nums[k] = nums[k], nums[l]
        # 3.反转k后面的顺序
        nums[k+1:] = reversed(nums[k+1:])
posted @ 2017-08-19 04:41  banananana  阅读(130)  评论(0)    收藏  举报