LeetCode-31-下一个排列问题

news2024/10/7 12:19:20

题目说明

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

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

方法一:暴力法

最简单的想法就是暴力枚举,我们找出由给定数组的元素形成的列表的每个可能的排列,并找出比给定的排列更大的排列。
但是这个方法要求我们找出所有可能的排列,这需要很长时间,实施起来也很复杂。因此,这种算法不能满足要求。 我们跳过它的实现,直接采用正确的方法。
复杂度分析
时间复杂度:O(n!),可能的排列总计有 n! 个。
空间复杂度:O(n),因为数组将用于存储排列。

方法二:一遍扫描

首先,我们观察到对于任何给定序列的降序排列,就不会有下一个更大的排列。
例如,以下数组不可能有下一个排列:
[9, 5, 4, 3, 1]
这时应该直接返回升序排列。

所以对于一般的情况,如果有一个“升序子序列”,那么就一定可以找到它的下一个排列。具体来说,需要从右边找到第一对两个连续的数字 a[i] 和 a[i-1],它们满足 a[i]>a[i-1]。
所以一个思路是:找到最后一个的“正序”排列的子序列,把它改成下一个排列就行了。
在这里插入图片描述
不过具体操作会发现,如果正序子序列后没数了,那么子序列的“下一个”一定就是整个序列的“下一个”,这样做没问题;但如果后面还有逆序排列的数,这样就不对了。比如 [1,3,8,7,6,2]

最后的正序子序列是[1,3,8],但显然不能直接换成[1,8,3]就完事了;
而应该考虑把3换成后面比3大、但比8小的数,而且要选最小的那个(6)。
接下来,还要让6之后的所有数,做一个升序排列,得到结果:[1,6,2,3,7,8]

代码实现如下:

public void nextPermutation(int[] nums) {
    int k = nums.length - 2;
    while( k >= 0 && nums[k] >= nums[k+1] )
        k--;
    // 如果全部降序,以最小序列输出
    if( k < 0 ){
        Arrays.sort(nums);
        return;
    }
    
int i = k + 2;
    while( i < nums.length && nums[i] > nums[k] )
        i++;
    
// 交换nums[k]和找到的nums[i-1]
    int temp = nums[k];
    nums[k] = nums[i-1];
    nums[i-1] = temp;
    
// k以后剩余的部分反转成升序
    int start = k + 1, end = nums.length - 1;
    while( start < end ){
        int reTemp = nums[start];
        nums[start] = nums[end];
        nums[end] = reTemp;
        start++;
        end--;
    }
}

复杂度分析
时间复杂度:O(N),其中 NN 为给定序列的长度。我们至多只需要扫描两次序列,以及进行一次反转操作。
空间复杂度:O(1),只需要常数的空间存放若干变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1607289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

考研日常记录

由于实在太无聊了 &#xff0c; 所以记录以下考研备考日常 &#xff0c; 增加一点成就感 &#xff0c; 获得一点前进动力。 2024.4.18 周四 课程情况&#xff1a; 无课 时间规划&#xff1a; 上午&#xff1a;休息 下午&#xff1a; 事项耗时进度备注写作业1h复习英语单词…

SayNav: 利用大语言模型在未知环境中导航

论文标题&#xff1a;SayNav: Grounding Large Language Models for Dynamic Planning to Navigation in New Environments 论文地址&#xff1a;https://arxiv.org/pdf/2309.04077.pdf 项目地址&#xff1a;https://www.sri.com/ics/computer-vision/saynav SayNav介绍 SayNa…

ExpandableListView可扩展列表视图,可折叠列表视图

目录 1. XML代码 2. ExpandableListView的使用 3. ExpandableListAdapter的使用 4. 数据观察者的使用 5. 案例代码一览 ExpandableListView&#xff08;可扩展/可折叠列表视图&#xff09;是一种多功能的高级控件&#xff0c;每个子项都可以展开一个孙子列表。点击一个分组…

科研基础与工具(笔记)

​ 免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 专业名词 影响因子&#xff08;Impact Factor&#xff09;&#xff0c;一般是特指SCI的影响因子&#…

Qt实现Mysql数据库的连接,查询,修改,删除,增加功能

Qt实现Mysql数据库的连接&#xff0c;查询&#xff0c;修改&#xff0c;删除&#xff0c;增加功能 安装Mysql数据库&#xff0c;QtCreator Mysql选择Mysql Server 8.1版本安装。 Mysql Server 8.1安装过程 1.首先添加网络服务权限&#xff1a; WinR键输入compmgmt.msc进入…

论文阅读:BEVBert: Multimodal Map Pre-training for Language-guided Navigation

BEVBert&#xff1a;语言引导导航的多模态地图预训练 摘要 现存的问题&#xff1a;目前大多数现有的预训练方法都采用离散的全景图来学习视觉-文本关联。这要求模型隐式关联全景图中不完整、重复的观察结果&#xff0c;这可能会损害智能体的空间理解。 本文解决方案&#xf…

PCBA镀金工艺介绍

PCBA&#xff08;印制电路板组装&#xff09;的镀金工艺是一种常见的表面处理方法&#xff0c;用于提高印制电路板&#xff08;PCB&#xff09;的性能和耐用性。本文将详细介绍PCBA的镀金工艺&#xff0c;包括其类型、工艺流程、优点及应用。 1. 镀金工艺的类型 PCBA的镀金主要…

Mac电脑版鼠标连点工具 RapidClick for Mac

RapidClick for Mac是一款方便实用的自动点击工具&#xff0c;可以帮助Mac用户在使用电脑时轻松、快速地进行鼠标操作。它可以模拟人类手指点击的动作&#xff0c;让您的鼠标点击变得更加快捷高效&#xff0c;大大提升了工作和游戏的效率。 RapidClick for Macv1.5.1激活版下载…

【windows-搭建Ubuntu22LTS】

一、环境要求 1. windows版本要求 至少Windows 10 2020年5月(2004) 版, Windows 10 2019年5月(1903) 版&#xff0c;或者 Windows 10 2019年11月(1909) 版 2. 控制面板开启相关的程序(需要重启) 二、Microsoft store安装unbuntu 下载后直接运行&#xff08;稍微等会&#…

mac: docker安装及其Command not found: docker

已经安装了docker desktop&#xff0c;没安装的 点击安装 傻瓜式安装即可 接着打开终端&#xff1a;好一个 Comand not found:docker 看我不把你整顿&#xff0c;解决如下&#xff1a; 如果你在 macOS 上安装了 Docker Desktop&#xff0c;但是终端无法识别 docker 命令&…

【ARM 裸机】汇编 led 驱动之烧写 bin 文件

1、烧写概念 bin 文件烧写到哪里呢&#xff1f;使用 STM32 的时候烧写到内部 FLASH&#xff0c;6ULL 没有内部 FLASH&#xff0c;是不是就不能烧写呢&#xff1f;不&#xff0c;6ULL 支持 SD卡、EMMC、NAND FLASH、NOR FLASH 等方式启动&#xff0c;在裸机学习的工程中&#x…

C++算法题 - 区间

目录 228. 汇总区间56. 合并区间57. 插入区间452. 用最少数量的箭引爆气球 228. 汇总区间 LeetCode_link 给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所…

IDEA报错然后pycharm闪退

pycharm闪退&#xff0c;在C盘的USER文件夹下有报错文件 打开一看&#xff0c;说内存不足 # There is insufficient memory for the Java Runtime Environment to continue. # Native memory allocation (mmap) failed to map 14596177920 bytes for G1 virtual space # Possib…

Redis入门到通关之分布式锁Rediision

文章目录 ☃️setnx实现的分布式锁存的问题☃️Redisson☃️分布式锁-Redission快速入门☃️实战☃️总结 ☃️setnx实现的分布式锁存的问题 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码…

Win10系统下关闭管理员运行确认弹窗

Windows10及以上系统对于安全的考虑&#xff0c;对于程序运行时的权限做了控制 点击后&#xff0c;会弹出确认的弹窗。 像我做测试&#xff0c;或者使用cmd经常需要administrator 权限&#xff0c;一直弹弹弹就很烦。 要实现右击后无需弹窗就可以使用管理员权限运行改…

世强硬创获Jowat授权代理,其热熔胶可实现重新分离和循环使用

随着全球对环境保护意识的提升&#xff0c;政府机构对挥发性有机化合物&#xff08;VOCs&#xff09;和其他有害排放物的限制越来越严格&#xff0c;这促使粘合剂制造厂商开发更环保的产品。 为拓展中国市场&#xff0c;德国胶王股份有限公司&#xff08;下称“德国胶王”&…

FX110网:香港交易所宣布开发Orion衍生品平台,预计于 2028 年推出

香港交易及结算所有限公司&#xff08;香港交易所&#xff0c;HKEX&#xff09;今天宣布开发 Orion 衍生品平台&#xff08;ODP&#xff09;&#xff0c;提供增强的交易、清算和风险管理能力。 这个新平台由香港交易所技术团队自行开发&#xff0c;预计于 2028 年推出&#xff…

LeetCode题目42:接雨水【python 42/1000】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

[C++][算法基础]求约数(试除法)

给定 n 个正整数 &#xff0c;对于每个整数 &#xff0c;请你按照从小到大的顺序输出它的所有约数。 输入格式 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数 。 输出格式 输出共 n 行&#xff0c;其中第 i 行输出第 i 个整数 的所有约数。 数据范围 1≤…

直播预告:拥抱AI-探索AI大模型在邮件反钓鱼检测的应用

随着ChatGPT的问世&#xff0c;生成式AI技术迅速渗透到我们生活的各个角落&#xff0c;以ChatGPT为代表的生成式AI技术&#xff0c;依托其强大的AI模型和海量数据&#xff0c;赢得了广泛的欢迎。 然而&#xff0c;生成式AI的不断演进也带来了新的挑战。大型语言模型&#xff08…