题目:
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
- 例如,
arr = [1,2,3]
,以下这些都可以视作arr
的排列:[1,2,3]
、[1,3,2]
、[3,1,2]
、[2,3,1]
。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
- 例如,
arr = [1,2,3]
的下一个排列是[1,3,2]
。- 类似地,
arr = [2,3,1]
的下一个排列是[3,1,2]
。- 而
arr = [3,2,1]
的下一个排列是[1,2,3]
,因为[3,2,1]
不存在一个字典序更大的排列。给你一个整数数组
nums
,找出nums
的下一个排列。必须 原地 修改,只允许使用额外常数空间。
来源:力扣(LeetCode)
链接:力扣
示例:
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]
示例 2:输入:nums = [3,2,1]
输出:[1,2,3]
示例 3:输入:nums = [1,1,5]
输出:[1,5,1]
解法:
下一个排列总是比当前排列要大,将原问题转换为找到一个大于当前序列的新序列,且变大的幅度尽可能小。
将一个左边的较小数与一个右边的较大数交换,以能够让当前排列变大,从而得到下一个排列。同时要让这个较小数靠右,而较大数越小越好。当交换完成后,较大数右边的数按照升序重新排列。
从右往左遍历列表寻找较小数,寻找破坏非降序的第1个数,即第1个当前值比前一个值小的数。
从右往左遍历列表寻找较大数,较大数为第1个大于较小数的数。
知识点:
1.原地修改列表:list[::]=。
2.Python交换两值:a,b=b,a。
3.sorted(iterable, cmp=None, key=None, reverse=False):sorted可以对所有可迭代类型进行排序,并且返回新的已排序的列表。iterable是可迭代类型;cmp是比较函数;key是可迭代类型中某个属性,对给定元素的每一项进行排序;reverse是降序或升序,默认升序。
代码:
class Solution: def nextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ num = nums[::] num.sort(reverse=True) if num == nums: nums.sort() else: for left in range(len(nums)): if nums[::-1][left + 1] < nums[::-1][left]: left = len(nums) - left - 1 - 1 break for right in range(len(nums)): if nums[::-1][right] > nums[left]: right = len(nums) - right - 1 break nums[left], nums[right] = nums[right], nums[left] nums[::] = nums[:left + 1] + sorted(nums[left + 1:])