Leetcode(31)下一个排列

【中等】力扣算法题解析LeetCode31:下一个排列 本文介绍了如何找到整数数组的下一个字典序更大的排列。算法步骤如下: 从右向左找到第一个下降的位置i; 若存在i,再从右向左找到第一个大于nums[i]的位置j; 交换i和j位置的元素; 反转i+1到末尾的子数组使其升序排列。整体时间复杂度O(n),空间复杂度O(1)。通过原地修改数组,实现了高效查找下一个排列。 阅读详情

题目描述

  • 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
  • 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。
  • 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
  • 1,2,3 → 1,3,2
  • 3,2,1 → 1,2,3
  • 1,1,5 → 1,5,1
思路

按照字典序,找到下一个更大的序列。 如果把一个序列表示成图:
在这里插入图片描述
从末尾开始找,直到找到峰的左边那个元素a[i-1],此时峰的右边都是降序的,不能改造为更大的。
再从尾部找比a[i-1]恰大的数a[j],交换他们。 右边的序列仍然保持降序,而a[i-1]变成一个稍大的数。
反转a[i:],使后半部分变为升序,此时序列正好变为下一个更大的序列。
总结:把大数移到高位,之前的序列和当前序列的跨度大了,所以把大数后面的序列改为最小序列即升序,此时为下一个更大序列。
【个人理解反转:就像找5月31日的下一天,找到5恰大的数6,变为6月31日,还要把31变为这个月最小的那一天1日,即6月1日。】

代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i = nums.size() - 2;
        while(i >= 0 &&  nums[i] >= nums[i + 1]  ) --i;
        if(i >= 0){
            int j = nums.size() - 1;
            while(j >= 0 && nums[i] >= nums[j]) --j;
            swap(nums,i,j);
        }
        reverse(nums, i+1);
    }

    void reverse(vector<int>& nums,int i){
        int j = nums.size() - 1;
        while(i < j){
            swap(nums,i,j);
            i++;
            j--;
        }

    }
    void swap(vector<int>& nums,int i,int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] = tmp;
    }
};

LeetCode 31 - 下一个排列 是一个经典题,考察对排列的基本操作,包括逆序、排序以及贪心思想。该题目常会出现在竞赛、面试中,变体场景也非常多,例如字典序排列的生成、排列搜索问题等。以下是详细解法、分析以及变体分类。实现获取下一个排列的算法,该排列是字典序中比当前排列大的下一个排列。 阅读详情

相关推荐

快速玩转 Llama2!机器学习 PAI 最佳实践(一)—低代码 Lora 微调及部署

本实践将采用阿里云机器学习平台PAI-快速开始模块针对 Llama-2-7b-chat 进行开发。PAI-快速开始支持基于开源模型的低代码训练、布署和推理全流程,适合想要快速开箱体验预训练模型的开发者。

阿里云云栖号 1766

【力扣LeetCode】31 下一个排列

题目描述(难度中) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 链接 https://leetcode-...

Jiewang的博客 414

STM32F407+LWIP实战:手把手教你移植mbedtls库实现Modbus TCP双向认证

本文详细介绍了如何在STM32F407微控制器上移植mbedtls库,结合LWIP协议栈实现Modbus TCP的双向认证功能。通过TLS 1.2加密通道,有效提升工业物联网通信的数据安全性,涵盖证书管理、内存优化及性能调优等关键步骤,为嵌入式系统开发者提供了一套完整的解决方案。

weixin_28721917的博客 516

力扣LeetCode 31.下一个排列

摘要:本文介绍了如何找出整数数组的下一个字典序排列。算法思路是从后往前找到第一个下降的元素,将其与后面恰好比它大的元素交换,然后对后续元素升序排序。若已是最大排列,则反转整个数组。解法时间复杂度为O(n),空间复杂度O(1)。示例展示了[1,2,3]→[1,3,2],[3,2,1]→[1,2,3]等转换过程。

2301_80470756的博客 55

【AIGC】COT思维链:让AI学会拆解问题,像人一样思考

COT思维链的出现,为AI的发展开辟了一条新的道路。它让AI学会了像人类一样思考,将复杂问题分解成简单的步骤,并逐步推理出最终答案。希望我的引导会对你产生启发。

智兔唯新的博客 9002

STM32CubeMX最新版下载安装全攻略(附官网访问问题解决方案)

本文提供了STM32CubeMX最新版的详细下载与安装指南,并针对国内开发者常见的官网访问缓慢、注册验证邮件延迟等问题,给出了实用的解决方案和备选策略。通过清晰的步骤解析,帮助用户快速部署这一强大的STM32图形化配置工具,从而高效启动嵌入式开发项目。

weixin_28256233的博客 194

力扣LeetCode #31 下一个排列(NextPermutation)

- 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。 来源:LeetCode - 示例 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 1,2,4,3 → 1,3,2,4 1,2,5,4,6,3 → 1,2,5,6,3,4 - 思路分析 刚开始看了测试用例,只考虑

weixin_49155948的博客 245

《点云处理算法》——GROR配准

GROR点云配准

阁楼 1315

#力扣LeetCode31. 下一个排列 @FDDLC

题目描述: 31. 下一个排列 - 力扣(LeetCode) (leetcode-cn.com) 自测用例: [1,2,3] [3,2,1] [1,1,5] [1] [1,3,2] [2,1,3] [2,3,1] [3,1,2] [2,3,1] [1,3,2] [2,2,1] [3,1,4,1,5,9,2,6] [1,2,3] [3,2,1] [1,1,1] [2,2,1] [3,1,4,1,5,9,2,6,3,9,1,10,33,10,37,100,3,38,22,19,30,1,2,3,4,

LiuXingchang的博客 390

MFC Tab Control控件完全指南:从基础使用到高级定制

本文详细介绍了MFC中TabControl控件的使用方法和高级技巧。主要内容包括:1) TabControl基础属性设置与绑定;2) 样式定制和外观自定义;3) 创建派生类实现扩展功能;4) 动态页面管理和子对话框控制;5) 高级功能如标签拖拽排序和右键菜单。通过完整代码示例,展示了从基本应用到复杂场景的实现方案,包括多标签页管理、自定义绘制、动态添加/删除标签等核心功能,为MFC开发者提供了全面的TabControl开发指南。

专注现代C++实战,从核心语法到高性能编程,助力开发者深入掌握系统级编程精髓。 257

深度探索:VS2022 牵手 DeepSeek,开启开发新征程

通过将 VS2022 与 DeepSeek 接入,我们成功开启了智能开发的新征程。从前期的硬件准备、软件环境搭建,到实战环节的一步步配置与整合,再到全面的测试与验证,每一个步骤都充满挑战,但也带来了满满的收获。在实际应用中,VS2022 与 DeepSeek 的结合展现出了强大的优势,为开发者带来了更高的效率和更出色的代码质量。无论是代码自动补全、智能代码审查,还是自然语言交互编程,都让开发过程变得更加智能、便捷,极大地提升了开发体验。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3524

【算法入门】LeetCode 31:下一个排列 - 掌握字典序的奥秘(Java & JavaScript)|# 力扣31. 下一个排列题解:Java与JavaScript双实现详解

LeetCode 31:下一个排列 问题描述 给定一个整数数组,找出其下一个字典序更大的排列。若已是最大排列,则返回最小排列。 解题思路 找逆序点:从后向前找到第一个满足 nums[i] < nums[i+1] 的索引 i 找交换点:在 i 右侧找到最小的大于 nums[i] 的值 nums[j] 交换元素:交换 nums[i] 和 nums[j] 反转后半:反转 i+1 到末尾的子数组 复杂度 时间 O(n),空间 O(1) 核心代码 void nextPermutation(int[] nums)

南北极之间 898

实现端到端加密的WebRTC视频会议终端

需要注意的是,上述示例代码中没有涉及到具体的加密算法和密钥交换过程,而是通过WebRTC API自动处理了加密和密钥交换的细节。然后,我们通过信令服务器将本地SDP发送给对方,并接收对方的SDP。最后,我们将对方的SDP设置为远程描述,并将最终的连接建立起来。最后,我们将对方的SDP设置为远程描述,并建立最终的连接。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。在本文中,我们将探讨如何使用WebRTC构建一个加密的视频会议终端,并提供相应的源代码。

WaJulia的博客 434

力扣31题-下一个排列

力扣31题-下一个排列

m0_65818274的博客 247

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

31. 下一个排列 - 力扣(LeetCode)

整数数组的一个就是将其所有成员以序列或线性顺序排列。arr[1,2,3][1,3,2][3,1,2][2,3,1]整数数组的是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。[1,3,2][3,1,2][1,2,3][3,2,1]给你一个整数数组nums,找出nums的下一个排列。必须。

Dubhehug的博客 943

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

LeetCode31-下一个排列

LeetCode31-下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 一、思路 (一)移动数 ...

lyd1995的博客 252

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

《LeetCode力扣练习》第31题 下一个排列 Java

《LeetCode力扣练习》第31题 下一个排列 Java 一、资源 题目: 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。 整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列

XRT_knives的博客 278

力扣第31题:下一个排列

学习目标: 力扣第31题:下一个排列 学习内容: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 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-p

童一的博客 430

LeetCode--31.下一个排列

那我们就将前面我们根本用不到的数给切掉,只考虑后面的数,那就新形成了一个数组嘛,我们就求这个数组的下一排列,是不是就简化了一下,反正求下一排列,前面那些权重比较大的数也动不得。当我们找到前面的数(p2)比后面的数(p1)小的那个位置的时候,我们就将前面的数(p2)依次与后面的所有的数(>=p1)相比较,找到一个最接近的数,与前面的数(p2)交换位置,再对。你可能有疑惑,是啊,我找出来了,但是,为什么要将前面的数(p2)与它后面的所有的数相比较,找出最接近它的数并且要比前面的数大呢?没有,也没关系,我会说。

dying_man的博客 1545

java学习 leetcode31 下一个排列

寻找降序对:从后向前找到第一个降序的位置,确保能找到一个比当前位置大的元素进行交换。寻找交换元素:在降序部分中找到刚好大于当前元素的值进行交换,保证新排列是下一个更大的排列。反转操作:将降序部分反转成升序,使得这部分成为最小的排列,从而保证整个数组是下一个字典序排列。

qq_64012735的博客 800

力扣31 下一个排列

寻找下一个排列

dastatham的博客 498

【LeetCode】31. 下一个排列

本文介绍了如何寻找整数数组的下一个字典序更大的排列。核心思路是通过三步操作:1)从右向左找到首个下降点i;2)在右侧找到大于nums[i]的最小元素j;3)交换i和j位置元素后反转i+1到末尾的子数组。若数组已完全降序,则直接反转整个数组得到最小字典序排列。该算法时间复杂度O(n),空间复杂度O(1),能正确处理含重复元素和边界情况。文章提供了详细示例、流程图、错误分析和测试用例,帮助理解这一经典排列问题。

qq_32019341的博客 1176

力扣31-下一个排列

因为x的右边都比它自己大,而y是比它大的数中最小的那个,也就是说实际上y和x之间的所有数都比它俩大,因此交换之后,y右边唯一比它更小的只有x,而在交换前右侧序列就已经递减,把最小的那个换成更小的,依然递减。而我们应当调整为递增,才能使得字典序是变大的当中最小的那个,所以把右侧序列反转即可。所以,第一步,我们需要做的是,找到从右往左数第一个”可能增大“的数 x,即 x 的右侧有比它更大的数。在刚刚的例子中,x 为2,显然 x 右侧的序列是单调递减的,否则从右往左数第一个”可能增大“的数就必然在 x 的右侧。

Kevincxt的博客 206

leetcode31-下一个排列

leetcode31-下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 题解 索引i由后往前遍历...

cicoa 225

LeetCode 31. 下一个排列:两种高效解法详解

给定一个整数数组 `nums`,要求找出该数组的**下一个排列**。所谓"下一个排列",是指将数组重新排列成**大于当前排列的最小字典序排列**。如果当前排列已经是最大排列(降序排列),则返回最小排列(升序排列)。

weixin_44435110的博客 1128
上一篇: Leetcode(19) 删除链表的倒数第N个节点——快慢指针
下一篇: Leetcode(23)合并K个排序链表——k个元素的排序
softwareX4
博客等级 码龄9年 21粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值