LinkCode 下一个排列、上一个排列

http://www.lintcode.com/zh-cn/problem/next-permutation-ii/#

原题

给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。

如果没有下一个排列,则输出字典序最小的序列。

样例

左边是原始排列,右边是对应的下一个排列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

解题思路(示例:[1,3,5,4,2])

  1. 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也就是3元素的索引指针)
  2. 接着从3元素后面的列表中[5,4,2]中找到一个比3大的最小元素,将3与其交换后得到([1,4,……])
  3. 将其后面的列表按照从小到大排序即得到下一个排列([1,4,2,3,5])

代码实现

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

  

原文地址:https://www.cnblogs.com/yechanglv/p/6935636.html