给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。
如果没有下一个排列,则输出字典序最小的序列。
样例
左边是原始排列,右边是对应的下一个排列。
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