LintCode 190: Next Permutation
LintCode 190: Next Permutation
题目描述
给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。
如果没有下一个排列,则输出字典序最小的序列。
样例
左边是原始排列,右边是对应的下一个排列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
Fri Feb 24 2017
思路
先看一个例子:
8, 5, 3, 7, 6, 5, 4, 1
下一个排列应该是:
8, 5, 4, 1, 3, 5, 6, 7
看起来应该是要从后往前找,找到第一个降序的数字,因为如果一直都是升序的话,说明这一部分以及是全排列的最大情况了。第一个比它后一个数小的数,就是需要替换为比他大一点的那个数。在上面的例子中就是3.
找到3以后,需要把它替换成一个比它大一点的数,于是再从后往前找,找到第一个比它大的数,在上面的例子中,就是4左边是原始排列,右边是对应的下一个排列。
将3和4交换,由于后半部分刚才已经是最大的全排列了,所以需要翻转一下,变成最小的全排列。
整个过程大概如下:
8, 5, 3, 7, 6, 5, 4, 1
8, 5, 3, 7, 6, 5, 4, 1
8, 5, 3, 7, 6, 5, 4, 1
8, 5, 4, 7, 6, 5, 3, 1
8, 5, 4, 7, 6, 5, 3, 1
8, 5, 4, 1, 3, 5, 6, 7
考虑一些特殊情况,若数组长度小于等于1,则下一个排列就是它本身,所以直接返回。
若数组本身就是最大的全排列,则在第一次从前往后寻找第一个比它后一个数小的数时,找到最前面也找不到,于是就不需要找第二个数了,直接将整个数组翻转就好了。
代码
// 下一个排列
void nextPermutation(vector<int> &nums)
{
if (nums.size() <= 1) return;
vector<int>::iterator l = nums.end() - 2;
for (; l >= nums.begin(); --l)
if (*l < *(l + 1)) break;
if (l >= nums.begin())
{
vector<int>::iterator r = nums.end() - 1;
for (; r != l; --r)
if (*r > *l) break;
swap(*l, *r);
}
reverse(l + 1, nums.end());
}
LintCode 190: Next Permutation的更多相关文章
- LintCode 388: Kth Permutation
LintCode 388: Kth Permutation 题目描述 给定 n 和 k,求123..n组成的排列中的第 k 个排列. 样例 对于 n = 3, 所有的排列如下: 123 132 213 ...
- lintcode:next permutation下一个排列
题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] ...
- lintcode:previous permutation上一个排列
题目 上一个排列 给定一个整数数组来表示排列,找出其上一个排列. 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1] 注意 ...
- [LintCode]——目录
Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...
- lintcode Permutation Index
题目:http://www.lintcode.com/zh-cn/problem/permutation-index/ 排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的 ...
- Lintcode: Permutation Index II
Given a permutation which may contain repeated numbers, find its index in all the permutations of th ...
- LintCode "Previous Permutation"
A reverse version of the Dictionary algorithm :) If you AC-ed "Next Permutation II", copy ...
- lintcode :Permutation Index 排列序号
题目: 排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号.其中,编号从1开始. 样例 例如,排列[1,2,4]是第1个排列. 解题: 这个题目感觉很坑的.感觉这只有 ...
- 211. String Permutation【LintCode by java】
Description Given two strings, write a method to decide if one is a permutation of the other. Exampl ...
随机推荐
- ubuntu下配置ss并设置PAC模式
一.安装ss 1. sudo apt-get update(更新源) 2. sudo apt-get install python-pip(安装pip) 3. sudo pip install sha ...
- vs快捷键代码格式化或代码对齐名字
开发人员,换个电脑后环境要重装,vs的环境也需要重新设置. 快捷键需要重新设置,插件也需要重装,在这里备注下,换个环境就可以直接用了. 由于vs不同版本,代码对齐或者代码格式化的快捷键都不一样,所以导 ...
- Hash(散列函数)简单应用引出解决散列冲突的四种方法
商店允许顾客通过电话订购商品,并在几天后上门自取.商店的数据库使用客户的电话号码作为其检索的关键字(客户知道自己的电话号码,而且这些电话关键字几乎是唯一的).如何组织商店的数据库,以允许更加高效的进行 ...
- 从理论到实践,全方位认识DNS
从理论到实践,全方位认识DNS 2015-11-23 程序员之家 作者:selfboot 原文:http://segmentfault.com/a/1190000003956853 对于 DNS(Do ...
- 框架整合小小总结【SSH】注解式
Spring 注解式注册 bean: 大致分为以下几步: 开启 context 空间支持 开启自动扫描功能,指定扫描包路径 使用注解配置 bean (使用@Component 注解) 给 bean 注 ...
- bzoj4798[CEOI2015] Calvinball championship
这年头,n方跑1万的题已经不多了... 题意 bzoj4798 不知道怎么叙述这个题意... 分析 如果某个序列字典序小于给定的序列,我们不妨考虑从左到右第一个小于给定的序列的位置,并枚举这个位置的数 ...
- [四]SpringBoot 之 捕捉全局异常
在class注解上@ControllerAdvice, 在方法上注解上@ExceptionHandler(value = Exception.class),具体代码如下: package me.shi ...
- WordPress忘记密码找回登录密码的四种行之有效的方法
WordPress忘记密码找回登录密码的四种行之有效的方法 PS:20170214更新,感谢SuperDoge同学提供的方法,登入phpMyAdmin后,先从左边选自己的数据库,然后点上面的 SQL ...
- 洛谷 P1231 教辅的组成(网络最大流+拆点加源加汇)
题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书 ...
- 连接Mysql数据库
JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含7个步骤: 1.加载JDBC驱动程序: 在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机), 这通过java.la ...