首页 > 其他分享 >31. 下一个排列(中)

31. 下一个排列(中)

时间:2024-01-30 13:12:30浏览次数:41  
标签:arr 排列 nums 一个 31 modify 数组 字典

目录

题目

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
    整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
    例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
    类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
    而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
    给你一个整数数组 nums ,找出 nums 的下一个排列。
    必须 原地 修改,只允许使用额外常数空间。

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

题解:找规律

  • 字典序:从左往右依次增大

  • 思路:这里举一个实际的例子,比如[1,2,7,4,3]的下一个字典序为[1,3,2,4,7],思考如何转化而来,首先是2和3换了位置[1,3,7,4,2],然后再把3后面的部分翻转就得到了结果。现在问题转化为,如何完成上面两步。1.通过观察得2是反着遍历的第一个i+1大于i的;3是反着遍历第一个大于2的数,找到这两个位置就可以完成第一步的交换。2.接着是翻转操作,把i到len-1的元素全部翻转即可。

  • 还有一种特殊情况:如[7,4,3,2,1]反着遍历没有找到i+1大于i的,此时由题干意思返回[1,2,3,4,7],只需翻转数组返回即可

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        n = len(nums)
        if n <= 1: return
        modify = -1
        # 从后往前寻找非升序数组的第一个元素对应的下标modify
        for i in range(n - 1, -1, -1):
            if i == n - 1: continue
            if nums[i] < nums[i + 1]:
                modify = i
                break
        # 如果modify没变,则此时排列为最大,将数组逆序
        if modify == -1: 
            nums[:] = nums[::-1]
        # 否则
        else: 
            target = -1
            # 找到modify之后比modify大且最接近的元素的下标target
            for i in range(n - 1, modify, -1):
                if nums[i] > nums[modify]: 
                    target = i 
                    break
            # 将modify和target位置的元素交换
            nums[modify], nums[target] = nums[target], nums[modify]
            # 将modify位置之后的元素倒序
            i, j = modify + 1, n - 1
            while i < j:
                nums[i], nums[j] = nums[j], nums[i]
                i, j = i + 1, j - 1

标签:arr,排列,nums,一个,31,modify,数组,字典
From: https://www.cnblogs.com/lushuang55/p/17996763

相关文章

  • 把git当作一个小型最终一致性的 json 数据库
    这几天写了一些有趣的代码:把git当作json数据库。做法是这样的:创建一个git仓库为每个最小粒度的数据创建一个独立的json文件({table}.json)客户端通过Python写git操作代码,实现几个数据库操作接口。数据库操作接口最小集:初始化:把git仓库拉下来(这个后面可以优化为只拉取指......
  • axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上
    axios实现,在一个极短时间内,请求同一个接口,若传参完全一样,则使用浏览器中的缓存中的上次的值。同时,上次的值应该在指定时间内可以自动清除。请写一个axios适配器。实现上述功能。在axios中,我们可以利用浏览器的缓存机制(HTTP缓存)来实现这个需求。不过,浏览器的HTTP缓存主要依赖于服......
  • 一个word的样式应用到另一个word
    参考:如何将一个word文档的样式应用到另一个word文档?_百度知道(baidu.com)......
  • 一个招标引发的思考
    现在混合系统招标越来越多,靠集成、靠做接口拉通不是优势了。财务系统我们不占优人力系统我们也没有绝对优势但是我们的财务、人力是一体的,共享一套权限体系、界面风格一直、数据天然拉通;更绝的是,我们还有OA,还有…并且这些都是同一个平台上的应用千里马平台就是要构造这样的生态......
  • 程序员小白写代码需要要养成的一个好习惯~
    1.业务逻辑与代码代码是需求逻辑的一种展现形式需求文档是业务逻辑的一种展现形式,而代码不过是业务逻辑的另一种表现形式;如果逻辑本身有问题,那么它的各种展示形式自然也是错的,所以写代码前应该先思考清楚业务逻辑。Review代码很多时候是逻辑问题在Review代码经验中发现:混乱的......
  • 【2024潇湘夜雨】WIN11_Pro_23H2.22631.3085软件选装纯净版1.29
    【系统简介】=============================================================1.本次更新母盘来自WIN11_Pro_23H2.22631.3085。2.增加部分优化方案,手工精简部分较多。3.OS版本号为22631.3085。精简系统只是为部分用户安装,个别要求高的去MSDN下。4.集成《DrvCeo-2.16.0.0》网卡版、......
  • 在大型项目中,内联样式可能并不是一个很好的选择,因为内联样式还是有局限性的
    内联样式的优点:使用简单:使用内联样式的好处就是简单的以组件为中心来实现样式的添加;扩展方便:通过使用对象进行样式设置,可以方便的扩展对象来扩展样式;避免冲突:样式通过对象的形式定义在组件中,避免了和其他样式的冲突。​在大型项目中,内联样式可能并不是一个很好的选择,因为......
  • [经验] 说一个人理性大于感性是什么意思
    1、理性大于感情的说说短句理性与感情是人类两个不同但又相互关联的方面。然而,当它们之间有冲突时,我们往往会发现自己更受感情的驱使,而忽视理性的重要性。下面是一些关于理性大于感情的说说短句,帮助我们更加理性地看待生活。“情感可以引导我们,但只有理性才能指导我们的决定。”感......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--加载字体
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewerPdfium.Net加载字体:1.加载ttf字体文件using(vardoc=PdfDocument.CreateNew()){varfontPath=@"c:\Windows\fonts\simhei.ttf";......
  • Pdfium.Net.Free 一个免费的Pdfium的 .net包装器--添加文本
    项目地址:Pdfium.Net:https://github.com/1000374/Pdfium.NetPdfiumViewer:https://github.com/1000374/PdfiumViewerPdfium.Net添加文本有3个重载1.当前重载使用pdf标准字库添加文字(中文会乱码)///<summary>///AddtextobjectusingoneofthestandardPDFfont......