实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
这题关键要找好两个位置,第一个是从后往前数第一个的数并记录其下标i,第二个是从后往前数第一个
的数并记录其下标j。然后调换两个数,并把a[i]后面的数从小到大排列。
所以思路就是:遍历+排序(我使用的是冒泡排序)
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
if n == 0 or n == 1:
return
i = n - 2
while(i>=0 and nums[i] >= nums[i+1]): i -= 1
if i < 0:
nums.sort()
return
else:
j = n - 1
while(nums[j]<=nums[i]): j-=1
temp = nums[i]
nums[i] = nums[j]
nums[j] = temp
for m in range(i+1,n):
for k in range(i+1,n - 1):
if nums[k] > nums[k+1]:
temp = nums[k]
nums[k] = nums[k+1]
nums[k+1] = temp
return