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

相关推荐

小华半导体HC32芯片开发使用说明

HC32F/L系列MCU在Keil MDK和IAR Workbench环境下通过工程样例进行软件开发。

小布的芯视角 5630

【力扣LeetCode】31 下一个排列

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

Jiewang的博客 414

【科研导航】【计算机视觉与图像处理】从顶刊到潜力股:跨学科(电子/电气/信息)SCI期刊投稿全景图

本文全面解析了计算机视觉与图像处理领域的SCI期刊投稿策略,涵盖从顶刊到潜力股的各类期刊特点。重点介绍了IEEE Transactions系列、Elsevier旗舰期刊以及二区优质期刊的审稿偏好和投稿技巧,特别适合电子/电气/信息交叉学科的研究者。文章还提供了三区、四区期刊的实用投稿建议,帮助科研新手快速找到适合的发表平台。

weixin_30897233的博客 81

力扣LeetCode 31.下一个排列

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

2301_80470756的博客 55

服务器被黑?快速检测和识别系统中的恶意进程

在管理服务器时,检测和识别系统中的恶意进程至关重要。本文介绍了使用 `ps`、`top`、`htop` 等系统监控工具,分析日志文件,以及使用 `chkrootkit` 和 `rkhunter` 等安全工具的方法。通过这些步骤,可以有效地检测和处理恶意进程,确保系统的安全和稳定。

_midnight的博客 1416

Win11内核隔离无法打开的解决方案详解

内核隔离问题的解决需遵循"先硬件后软件"的排查原则,90%以上的案例可通过驱动清理或外设断开解决。对于必须禁用该功能的用户,建议定期使用Windows Defender进行全盘扫描,并保持系统更新至最新版本。技术决策需在安全性和兼容性之间取得平衡,本文提供的多维解决方案可帮助用户构建更稳定的Windows 11使用环境。

mmoo_python的博客 4826

力扣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

Dify 第 13 篇 Dify 工作流 详解

工作流通过将复杂任务分解为节点降低复杂度,提升LLM应用的性能和稳定性。Dify工作流分为两类:Chatflow面向对话场景(如客服),支持多轮对话;Workflow面向批处理场景(如翻译),提供逻辑节点实现自动化。核心概念包括节点、变量(系统/会话/环境变量)及应用类型差异:Chatflow支持中间输出和对话历史,Workflow仅支持结束节点输出。系统变量以"sys"开头,用于全局数据传递,不同应用类型变量不同,如Chatflow的sys.query存储用户输入,Workflow的s

甘蓝的专栏 3246

#力扣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

Linux----Ubuntu系统官网下载iso镜像文件

Linux----Ubuntu系统官网下载iso镜像文件

MQ0522的博客 5万+

Google Gemini 模型本地可视化

Google近期发布了Gemini模型,而且开放了Gemini Pro API,Gemini Pro 可免费使用!Gemini Pro支持全球180个国家的38种语言,目前接受文本、图片作为输入并生成文本作为输出。Gemini Pro的表现超越了其他同类模型,当前版本配备了 32K 文本上下文窗口,可免费使用,且其定价将十分有竞争力。Gemini Pro具备丰富的功能:函数调用、数据嵌入、语义检索、自定义知识嵌入以及聊天功能。

HJ_blog 1246

【算法入门】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

车载网络测试实操源码_使用CAPL解析VBF文件

VBF(Versatile Binary Format)文件是一种二进制文件格式,被沃尔沃、福特、马自达、吉利等汽车制造商广泛采用。这种格式无法使用我们常规的烧录器进行刷写,通常需要进行解析转化。如果各位需要自己编写软件或脚本来刷写VBF文件,或者需要对刷写功能进行测试时,那么本篇文章就会对你非常有用。今天我们就来讲一下如何使用CAPL脚本对VBF文件进行数据解析。VBF文件包含三部分:VBF版本段、文件头段、数据段。前面的版本段和文件头段是ASCII码,包含版本、地址、校验码等信息

文章主要涉及嵌入式软件开发、测试、项目管理等,欢迎交流,共同进步。 2991

力扣31题-下一个排列

力扣31题-下一个排列

m0_65818274的博客 247

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LeetCode31-下一个排列

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

lyd1995的博客 252

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《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、付费专栏及课程。

余额充值