Leecode31. 下一个排列——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达
以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!
传送门——>Leecode大厂热题100道系列题解
问题描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
示例 1:
输入:nums = [1,2,3]
输出:[1,3,2]示例 2:
输入:nums = [3,2,1]
输出:[1,2,3]示例 3:
输入:nums = [1,1,5]
输出:[1,5,1]示例 4:
输入:nums = [1]
输出:[1]
提示:
1 <= nums.length <= 100
0 <= nums[i] <= 100
思路
这道题是根据 维基百科 ,下图所示:
翻译过来:
- 先找出最大的索引kkk满足nums[k]<nums[k+1]nums[k] < nums[k+1]nums[k]<nums[k+1],如果不存在,就翻转整个数组;
- 再找出另一个最大索引lll满足nums[l]>nums[k]nums[l] > nums[k]nums[l]>nums[k];
- 交换nums[l]nums[l]nums[l]和nums[k]nums[k]nums[k];
- 最后翻转nums[k+1:]nums[k+1:]nums[k+1:]。
举个例子:
比如nums=[1,2,7,4,3,1]nums = [1,2,7,4,3,1]nums=[1,2,7,4,3,1],下一个排列是什么?
我们找到第一个最大索引是nums[1]=2nums[1] = 2nums[1]=2
再找到第二个最大索引是nums[4]=3nums[4] = 3nums[4]=3
交换,nums=[1,3,7,4,2,1]nums = [1,3,7,4,2,1]nums=[1,3,7,4,2,1];
翻转,nums=[1,3,1,2,4,7]nums = [1,3,1,2,4,7]nums=[1,3,1,2,4,7]
完毕!
所以,
时间复杂度:O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1)
class Solution {public:void nextPermutation(vector<int>& nums) {bool flag = true;int len = nums.size();if(len == 1) return; // 特判int p = len - 2;while(p >= 0) {if(nums[p] < nums[p + 1]) {flag = false;for(int i = len-1; i > p; i--) {if(nums[i] > nums[p]) {swap(nums[p], nums[i]);reverse(nums.begin() + p + 1, nums.end());goto loop;}}}p--;}loop:;if(flag) reverse(nums.begin(), nums.end());return;}
};
Leecode31. 下一个排列——Leecode大厂热题100道系列相关推荐
- Leecode06. Z 字形变换——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode 21. 合并两个有序链表——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 题目描 ...
- Leecode15. 三数之和——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode11. 盛最多水的容器——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode22. 括号生成——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode20. 有效的括号——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode19. 删除链表的倒数第 N 个结点——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 题目描 ...
- Leecode17. 电话号码的字母组合——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
- Leecode07. 整数反转——Leecode大厂热题100道系列
我是小张同学,立志用最简洁的代码做最高效的表达 以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言! 传送门-->Leecode大厂热题100道系列题解 问题描 ...
最新文章
- [spring-boot] 多环境配置
- Priority VS Bandwidth
- Redis主从配置及通过Keepalived实现Redis自动切换高可用
- 设计模式11-桥接模式
- 控制Java并行流的并行度
- npm设置http代理
- Redis那些事(一) — Redis简介
- 投资大佬都在看的一张报表
- SQL Server删除语句
- ELK下Kibana的使用
- HTML 教程(一文彻底搞懂HTML)
- 分享一个代码合并工具
- 乐高集团携手合作伙伴在中国推广乐高盲文积木颗粒公益项目
- 电子行报告:从海外龙头发展历程看国内半导体设备企业投资价值
- PC端打不开微信公众号文章、微信图片加载超缓慢的处理方法(最全的解决方法)
- emacs 启动页面定制
- Google GMS Crash 优化方案
- mysql查询成绩并排名_一条SQL语句实现查询出成绩名次排名
- 使用 awk 处理一个对齐问题
- 小米手机--刷机指南
热门文章
- Redis 特殊数据类型 :Geospatial、Hyperloglog、Bitmap
- 高级数据结构与算法 | 回溯算法(Back Tracking Method)
- Redis缓存击穿和缓存雪崩、缓存穿透以及对应的解决方案
- 推荐一款日志切割神器,好用到爆!!
- Scala与Java集合互转摘要
- 应用深度学习使用 Tensorflow 对音频进行分类
- 『每周观察』:“在线抓娃娃”开启新娱乐窗口
- 机器学习实战教程(四):朴素贝叶斯基础篇之言论过滤器
- c++实现单例类(懒汉与饿汉)
- ffmpeg内存模型及AVPacket和AVFrame API基本使用