[LeetCode]31. Next Permutation
31. Next Permutation
- 找到最后一个升序的下标,如果不存在,则说明这个排列是升序的,此排列已经是最大的排列,那么直接反转即可,比如3,2,1的结果则为1,2,3;
- 找到最后一个比升序的下标的值还要大的下标,进行两两交换;
- 将升序下标以后的值都进行反转;
import bisect
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
# 1.从后面找到第一个升序的值
k = -1
for i in range(len(nums)-2, -1, -1):
if nums[i] < nums[i+1]:
k = i
break
# 说明是全是降序
if k == -1:
nums.reverse()
return
# 2.从后面找到第一个比k要大的值,交换
l = -1
for i in range(len(nums)-1, k, -1):
if nums[i] > nums[k]:
l = i
break
nums[l], nums[k] = nums[k], nums[l]
# 3.反转k后面的顺序
nums[k+1:] = reversed(nums[k+1:])
关注公众号:数据结构与算法那些事儿,每天一篇数据结构与算法

浙公网安备 33010602011771号