leetcode31 下一个排列

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

算法过程
标准的“下一个排列”算法可以描述为:

从后向前查找第一个相邻升序的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序
在 [j,end) 从后向前查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的“小数”、“大数”
将 A[i] 与 A[k] 交换
可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序
如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤 4

int cmp(const void *a, const void *b)
{
    return *((int *)a) - *((int *)b);
}
void nextPermutation(int* nums, int numsSize){
    if(!nums || numsSize <= 1) {
        return;
    }
    int i = numsSize - 1;
    bool flag = false;
    for (; i > 0; i--) {
        if (nums[i] > nums[i - 1]) {
            flag = true;
            break;
        }
    }
    if (flag) {
        
        int change = nums[i - 1];
        int min_value = nums[i];
        for (int j = i; j < numsSize; j++) {
            if (nums[j] > change) {
                min_value = nums[j] < min_value ? nums[j] : min_value;
            }
            
        }
        int j = i;
        for (; j < numsSize; j++) {
            if (nums[j] == min_value) {
                break;
            }
        }
        //printf("%d %d %d %d\n", i, nums[i - 1], j, nums[j] );
        int tmp = nums[j];
        nums[j] = nums[i - 1];
        nums[i - 1] = tmp;
        qsort(&nums[i], numsSize - i, sizeof(int), cmp);
    } else {
        qsort(nums, numsSize, sizeof(int), cmp);
    }
}

 

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

相关推荐

gnss变形监测基础(四)

监测站的数据采样率指的是监测站在单位时间内收集数据的频率,通常以赫兹(Hz)为单位。在GNSS变形监测中,数据采样率决定了监测系统能够捕捉到的变形动态变化的详细程度和时间分辨率。例如,一个采样率为1Hz的GNSS监测站意味着它每秒钟收集一次位置数据;而一个采样率为10Hz的监测站则每秒钟收集10次位置数据。较高的采样率能够提供更细致的时间序列数据,有助于分析快速变化的动态过程,如地震活动或建筑物的振动响应。然而,较高的采样率也意味着数据量更大,可能需要更多的存储空间和更强大的数据处理能力。

我的博客 1293

【力扣LeetCode】31 下一个排列

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

Jiewang的博客 414

LLVM 编译器学习笔记之三十六-- 指令调度Instruction scheduling

1、参考Instruction scheduling in LLVM - 知乎,在中后端均存在指令调度 指令调度模型 2、在llvm12->llvm14 中Machine Instruction Scheduler有个patch增强了load/store指令的合并,也就是指令调度不仅仅只是改变指令的顺序,该优化类似gcc中的store-merge优化 .....................................................................

~ 飞 扬 的 天 空 ~ 5688

力扣LeetCode 31.下一个排列

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

2301_80470756的博客 55

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 957

【vivado PG学习】1 PG168:7 Series FPGAs Transceivers官方配置方法学习笔记

介绍: The 7 series FPGAs Transceivers Wizard LogiCORE™ IP 自动创建配置7系列fpga 收发器的HDL封装。向导可以配置一个或多个支持行业主流标准的高速串行收发器。或者从零开始支持各种自定义协议。 功能: 创建配置7系列fpga 收发器的HDL封装。 自动对模拟设置进行配置。 预定义了提供Aurora 8B/10B, Aurora 64B/66B, CEI-6G,DisplayPort, Interlaken, Open Base StationAr..

w0shishabi的博客 5万+

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

基于DFT的mbist sdc模板(DFT)

摘要:本文详细介绍了DFT测试模式下的SDC约束方法。

murphyrong的博客 922

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

[QMT和ptrade量化交易小白入门]-121、如何用K-means聚类,每月自动筛选高流动性ETF

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 828

使用Simulink对基于GaN器件的高频电源进行建模与仿真,重点在于优化其效率

本文介绍了基于Simulink的GaN器件高频电源仿真建模方法。通过7个步骤详细讲解系统构建过程:从创建模型、设置电源、配置GaN开关网络,到添加磁性元件、负载和控制器设计,最后进行仿真分析。重点探讨了效率优化策略,包括开关频率选择、磁性元件优化、散热设计改进及控制策略调整。该教程为GaN器件在电力电子系统中的应用提供了完整的仿真流程指导,有助于设计人员验证方案并优化性能。

amy_mhd的博客 234

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

SAP ATP可用性检查简介

系统中建立此单时,SAP就会做一个所谓的检查,检查一下我们预先设定的考虑因素,能否满足客户的要求,什么时候可以满足,这就是可用性检查的功能。2、同样的在创建生产订单的时候也有ATP的检查,生产订单是100PC,要求2024-07-01生产完成,系统就会根据配置进行物料的可用性的检查,看物料是否能够满足生产同时能够满足交期。14: 表示相关预留的选项,与10的区别在于,10是一般是表示我们用MB21建立的,而14是表示由于相关预留,即此预留是来自于其他物料,如生产订单所产生的预留。

我小时候很黑的博客 3377

力扣31题-下一个排列

力扣31题-下一个排列

m0_65818274的博客 247

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode31-下一个排列

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

lyd1995的博客 252

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

《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的博客 801

力扣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的博客 1129
上一篇: leetcode 22 括号的生成 回溯法
下一篇: leetcode 33. 搜索旋转排序数组 二分法查找
chen_ethan
博客等级 码龄9年 2粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值