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