给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。
如果没有下一个排列,则输出字典序最小的序列。
样例
左边是原始排列,右边是对应的下一个排列。
1,2,3→1,3,2
3,2,1→1,2,3
1,1,5→1,5,1
class Solution:
    # @param nums: a list of integer
    # @return: return nothing (void), do not return anything, modify nums in-place instead
    def nextPermutation(self, nums):
        # write your code here
        change_index = -1
        # 找到需要变换的比后一个数字小的数
        for i in xrange(len(nums)-1, 0, -1):
            if nums[i] > nums[i-1]:
                change_index = i-1
                break
        if change_index == -1:
            nums.reverse()
            return nums
        min_nums_index = change_index+1
        # 找到后面列表中比change_index元素大的最小值
        for j in xrange(change_index+1, len(nums)):
            if(nums[j]>nums[change_index]) and (nums[min_nums_index]>nums[j]):
                min_nums_index = j
        # 交换元素
        nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
        # 排序后面的列表
        back = sorted(nums[change_index+1:])
        nums[change_index+1:] = back
        return nums
是上一题的逆思路,这里就直接上代码啦
class Solution:
    # @param num :  a list of integer
    # @return : a list of integer
    def previousPermuation(self, nums):
        # write your code here
        change_index = -1
        # 找到需要变换的比后一个数字大的数
        for i in xrange(len(nums)-1, 0, -1):
            if nums[i] < nums[i-1]:
                change_index = i-1
                break
        if change_index == -1:
            nums.reverse()
            return nums
        min_nums_index = change_index+1
        # 找到后面列表中比change_index元素小的最大值
        for j in xrange(change_index+1, len(nums)):
            if(nums[j]<nums[change_index]) and (nums[min_nums_index]<nums[j]):
                min_nums_index = j
        # 交换元素
        nums[change_index], nums[min_nums_index] = nums[min_nums_index], nums[change_index]
        # 排序后面的列表,降序
        back = sorted(nums[change_index+1:],reverse=True)
        nums[change_index+1:] = back
        return nums
原文:http://www.cnblogs.com/yechanglv/p/6935636.html