欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

每日一练

程序员文章站 2022-07-12 08:56:26
...

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation

基本思路是将列表从后往前部分遍历,若是排列顺序是从大到小,则多遍历一位,当第一次不满足从大到小,即遍历的部分列表的首位不为部分列表的最大时,将首位与第一个比它大的数交换,同时将新部分列表除首位的列表重新排序,再将新部分列表与之前的部分列表重新组合。yysy听起来大概蛮复杂的,我也不咋会表达,直接代码附上吧

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        if(len(nums) == 1):  #列表只有一数,直接输出
            pass
        else:
            i = -2
            while nums[i:len(nums)] == sorted(nums[i:len(nums)])[::-1]:
                i-=1    #从后往前依次遍历,直至找出首位不为max
                if i < -len(nums):   #超出范围break
                    break
            if i+1 == -len(nums):  #遍历到最后,即数组本身最大,倒序输出
                p = nums.copy()
                for i in range(len(nums)):
                    nums[i] = p[-i-1]
            else:
                test = max(nums[i:len(nums)])-nums[i] 
                fir = 0  #找index
                for t in nums[i:len(nums)]:
                    if t-nums[i] > 0 and t-nums[i] <= test:
                        for (m,n) in enumerate(nums): #找最后一个index,防重
	                        if n == t:
		                        fir = m
                        test = t-nums[i]
                nums[fir],nums[i] = nums[i],nums[fir] #交换首位与index
                nums[i+1:len(nums):] = sorted(nums[i+1:len(nums):]) #原位更改

每日一练
昨天写这个的心路历程真心有点崩,先报错要原位修改,之后报错单数列表,然后还有有重复数字的列表,以前一直以为index第二个参数是找列表中第几次出现的数,结果是strat,end…无奈用enumerate找最后一个index
估计代码写复杂了点,昨天晚上写的脑子有点懵,估计有好多地方可以优化,开始时判断是否为从大到小顺序貌似用for遍历就可以,但是——好累,懒得改了…每日一练