31. Next Permutation
2019-07-14 本文已影响0人
poteman
思路,
- 从后(倒数第二位开始)往前找到第一个比后面相邻一位小的index,设置为target;
- 如果target==-1(数组的元素是按照从大到小排列,则直接将数组排序后输出);
- 从target开始往后遍历,找到和当前target大,但最接近的数字对应的index为replace;
- 交换target和replace的数字所在位置;
- 将target后面的数组从小到大排序。
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
idx = len(nums) - 2
target = -1
for i in range(idx, -1, -1):
if nums[i] > nums[i + 1]:
continue
else:
target = i
break
if target == -1:
return sorted(nums)
replace = len(nums) - 1
for i in range(target + 1, len(nums)):
if nums[i] <= nums[target]:
replace = i - 1
break
nums[target], nums[replace] = nums[replace], nums[target]
res = nums[:target + 1]
res.extend(sorted(nums[target + 1:]))
return res