【每日一题】31. Next Permutation
题目描述
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place and use only constant extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3` → `1,3,2`
`3,2,1` → `1,2,3`
`1,1,5` → `1,5,1
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
题解
首先想到的是,按顺序生成当前数组所有可能的排列组合,然后根据当前排列组合在其中的位置,如果是最后一个,返回第一个;否则,返回所在位置的下一个排列。为了保证不同排列符合题目的顺序,在生成所有组合之前,先进行升序排序,然后再进行排列。–但是这种情况,时间复杂度太高,而且不满足题目要求的空间复杂度要求。
所以想到,根据上述的排列过程找出规律,根据给出的排列情况,直接生成下一个排列。
比如,对于数组1,2,3,4,5
,下一个排列应该是1,2,3,5,4
,下一个应该是1,2,4,3,5
.变动的情况先发生在末尾,在以1,2,3,4
之后只有一个5,下一个排列,应该保持1,2,3
不动,整体变成1,2,3,5,4
;
- 从后往前,先找到第一个不是降序排序的数字的下标;
- 如果下标<0,说明这个排列应该是最后一个,返回全序列的升序排序结果;
- 如果不为0,在这个元素之后找到第一个比它大的数字的下标,两者交换,对后续子数组做升序排序即可。
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
# 1,2,4,3,0
if (nums.empty()) return;
int size = nums.size(), i = size - 2, j = size - 1;
while (i>=0 && nums[i] >= nums[i+1]) i--;
if (i >= 0){
while (nums[j] <= nums[i]) j--;
swap(nums[i], nums[j]);
}
reverse(nums.begin()+i+1, nums.end());
}
};
感觉说的不够清晰~
Reference
https://www.cnblogs.com/grandyang/p/4428207.html
- PhalGo-初识PhalGO
- 【学术】如何在神经网络中选择正确的激活函数
- PhalGo-Echo路由
- PhalGo-介绍
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— 分布式主键
- [喵咪Golang(2)]安装和Helloworld
- LSTM的简单介绍,附情感分析应用
- 使用实体嵌入的结构化数据进行深度学习
- Otter-入门篇3(Node搭建)
- PhalGo-Respones
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 改写
- Otter-入门篇2(Manager安装配置)
- Java的字符串常量相关的一个问题
- [喵咪Liunx(3)]端口转发工具rinetd
- 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 数组属性和方法
- 强大的 Stream API(三)
- 微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣
- 强大的 Stream API(二)
- 无限想象空间,用Python玩转3D人体姿态估计
- 300亿美元,AMD为什么要买Xilinx?
- Angular5.0.0新特性
- 用Python实现坦克大战游戏 | 干货贴
- android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)
- Android Studio 3.0被调方法参数名提示的取消方法
- Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
- 解决python多线程报错:AttributeError: Can't pickle local object问题
- TensorFlow2.1.0最新版本安装详细教程
- Android仿京东首页秒杀倒计时
- 超实用的android自定义log日志输出工具类
- spring进行mock测试