下一个排列
时间:2021-08-08
本文章向大家介绍下一个排列,主要包括下一个排列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接:https://leetcode-cn.com/problems/next-permutation
题目描述:
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)
必须 原地 修改,只允许使用额外常数空间。
示例 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] <= 10
题解:
- 获取一个比当前排列更大的排列,只需将后面的大数与前面的数交换。比如 123456,将 5 和 6 交换就能得到一个更大的数 123465。
- 交换后获得的增幅要尽可能小。将一个 尽可能小的「大数」 与前面的「小数」交换。例如123465,下一个排列应该把 5 和 4 交换而不是把 6 和 4 交换。
- 将「大数」换到前面后,需要将「大数」后面的所有数重置为升序,升序排列就是最小的排列。
题解链接:下一个排列算法详解
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i;
for(i = nums.size() - 2; i >= 0; i--) //从后往前遍历,找到第一个升序
{
if(nums[i] < nums[i + 1])
break;
}
if(i == -1) //不存在下一个更大的排列
reverse(nums.begin(), nums.end());
else{
for(int j = nums.size() - 1; j >= i+1; j--) //查找后续序列中比nums[i]大的最小值
{
if(nums[i] < nums[j])
{
swap(nums[i], nums[j]); //将大数与小数交换
reverse(nums.begin() + i + 1, nums.end()); //将「大数」后面的所有数重置为升序
break;
}
}
}
}
};
原文地址:https://www.cnblogs.com/ZigHello/p/15115086.html
- 将磁盘误挂载到根分区下的问题处理记录
- python文件读写出现乱码总结
- 分布式监控系统Zabbix-图形集中展示插件Graphtree
- 分布式监控系统Zabbix-添加windows监控主机
- 盘点世界十大著名黑客攻击事件
- AS3中的单件(Singleton)模式
- puremvc框架之hello world!
- windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
- puremvc框架之Command
- python sorted函数
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
- puremvc框架之proxy
- Oracle数据库冷备份与热备份操作梳理
- Oracle数据库重做日志及归档日志的工作原理说明
- 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 数组属性和方法
- MySQL INSERT的4种形态
- PowerBI DAX 性能优化 高级视图算法 超越经典 性能提升成千上万倍
- Java开发必备 Git 分支开发:规范指南及完全学会Git的24堂课笔记
- 聊聊dubbo-go的failbackCluster
- 视频综合管理平台EasyNVS通道列表如何获得RTMP地址和RTSP地址?
- 【每周一库】 rust-ftp - an FTP client written in Rust
- Mall 电商实战项目发布重大更新,全面支持SpringBoot 2.3.0 !
- Python与Tableau相结合,万字长文搞定传统线下连锁店数据分析
- 社群答疑精选03:拆分数据到新工作表
- 【Rust日报】2020-08-08:用rust制作的一个Taskwarrior终端用户界面
- 【Rust日报】2020-08-09:1Paasword Linux版本
- 聊聊dubbo-go的failfastCluster
- Caused by: java.lang.ClassNotFoundException: Cannot find class: userMap
- 链路聚合实验
- 聊聊dubbo-go的failsafeCluster