LeetCode题目31:下一个排列
时间:2022-07-23
本文章向大家介绍LeetCode题目31:下一个排列,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
原题描述
+
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
原题链接:https://leetcode-cn.com/problems/next-permutation
思路解析
+
得研究一下数字上的规律,用实例可能更容易说清楚。
举例这个数字158476531,我们在下图中,把它分为两部分。红色指定的是尾部降序的部分。应该清楚的意识到,当一组数字处于降序排列时,它就是这些数字能组成的最大值了。
所以,通过只交换动红色部分的数字来期待获取更大的值,是根本不可能做到的。这就必须要开始让蓝色部分的数字参与了。
为此,我们向前再多看一位数字。如下图所示,这时的数字不是降序,它是有潜力通过内部交换而得到下一个排列的。
现在的问题是,内部怎么交换。数字4这个位置肯定是要被换掉的,为了并且交换之后,新的数字必须是下一个排列,不能是下下个排列。所以我们应该让这个数字不要太大,只比当前的数字大即可。
如果4与7或者6交换,很明显是大了太多了;与3或1交换,又会比当前的小。那么选择的依据就是将将比4大的数字,那就是5。
还没结束,交换之后,后面的数字要改成升序,变成最小值才行。
复杂度分析
+
- 时间复杂度:
- 空间复杂度:
C++参考代码
+
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() < 2) return;
int n = nums.size();
int i = n - 2, j = n - 1, k = n - 1;
while (i >= 0 && nums[i] >= nums[j]) {
--i; --j;
}
if (i >= 0) {
while (k >= j && nums[k] <= nums[i]) --k;
swap(nums[k], nums[i]);
}
reverse(nums.begin() + j, nums.end());
}
};
- .Net中如何操作IIS
- Havex:以工控设备为狩猎目标的恶意软件
- 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践
- 浅谈php安全
- 在统一的分析平台上构建复杂的数据管道
- 隐藏在注册表的恶意软件 – Poweliks
- 数千万WordPress和Drupal站点存在DDoS风险
- 利用基因突变和K均值预测地区种群
- 缓冲区溢出攻击初学者手册(更新版)
- 在Python机器学习中如何索引、切片和重塑NumPy数组
- HelloWorld,我的第一趟旅程出发点
- Android OpenGL开发实践 - GLSurfaceView对摄像头数据的再处理
- 走进科学:对七夕“超级病毒”XX神器的逆向分析
- 机器学习 - 朴素贝叶斯分类器的意见和文本挖掘
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Oracle数据库的对象
- 打卡群刷题总结1008——加油站
- 打卡群刷题总结1005——跳跃游戏
- 真是活久见,在 Minecraft 的虚拟游戏里竟然还能管理 Kubernetes!
- 打卡群2刷题总结1007——反转链表
- 打卡群2刷题总结1001——两数之和 II - 输入有序数组
- 复杂一点的SQL语句
- PL/SQL Developer连接本地Oracle 11g 64位数据库
- 打卡群刷题总结1007——买卖股票的最佳时机 II
- 事务Transaction
- 打卡群2刷题总结1006—— 删除链表的倒数第N个节点
- 打卡群刷题总结1006——跳跃游戏 II
- 面试官常问的Spring依赖注入和Bean的装配问题,今天给大家讲清楚!
- 打卡群刷题总结1003——分割等和子集
- 打卡群2刷题总结1005——有效的括号