题目分析:
这一题是让我们返回一个恰好大于给定序列的数的序列,如果找不到(即原序列是最大的)就倒序返回。
例子:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
代码说明:
上面的例子较短不容易找到规律,如果给定序列:1 2 7 4 3 1,那么结果应该是1 3 1 2 4 7。
变换过程如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
- 因为是找更大的数,那么从后往前看一定是递增的,找到一个突然变小的位置标记如,上面的2
- 找到后从变小的位置向后是递减的,因为要恰好大于,那就找到一个恰好大于它的数,上面的3
- 互相交换位置
- 从原来变小的位置(例子中的2)后面倒序,这个结果就是恰好大于原来的序列
代码中已有注释,不再详细解释
测试代码:
class Solution:
def nextPermutation(self, nums):
#length记录数组长度,l用来循环
length = l = len(nums)
#记录是否进入循环,如果没有证明是最大的,直接反序
flag = True
while(l >= 2):
#倒序寻找一个前一个小于后一个的位置,用于交换
if nums[l - 1] > nums[l - 2]:
flag = False
left = l - 2
right = -1
#寻找一个刚好大于我们要交换的数
for i in range(l-1, length):
if nums[l-2] >= nums[i]:
right = i - 1
break
#交换
nums[left], nums[right] = nums[right], nums[left]
#后半段反序
nums[left+1: length] = list(reversed(nums[left+1: length]))
break
l -= 1
#如果没有进入循环证明是最大的,直接反序
if flag: nums.reverse()
print(nums) #提交时请删除该行
Solution().nextPermutation([1, 2, 7, 4, 3, 1]) #提交时请删除该行