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左边是原始排列,右边是对应的下一个排列。

34交换,由于后半部分刚才已经是最大的全排列了,所以需要翻转一下,变成最小的全排列。

整个过程大概如下:

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的更多相关文章

  1. LintCode 388: Kth Permutation

    LintCode 388: Kth Permutation 题目描述 给定 n 和 k,求123..n组成的排列中的第 k 个排列. 样例 对于 n = 3, 所有的排列如下: 123 132 213 ...

  2. lintcode:next permutation下一个排列

    题目 下一个排列 给定一个整数数组来表示排列,找出其之后的一个排列. 样例 给出排列[1,3,2,3],其下一个排列是[1,3,3,2] 给出排列[4,3,2,1],其下一个排列是[1,2,3,4] ...

  3. lintcode:previous permutation上一个排列

    题目 上一个排列 给定一个整数数组来表示排列,找出其上一个排列. 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1] 注意 ...

  4. [LintCode]——目录

    Yet Another Source Code for LintCode Current Status : 232AC / 289ALL in Language C++, Up to date (20 ...

  5. lintcode Permutation Index

    题目:http://www.lintcode.com/zh-cn/problem/permutation-index/ 排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的 ...

  6. Lintcode: Permutation Index II

    Given a permutation which may contain repeated numbers, find its index in all the permutations of th ...

  7. LintCode "Previous Permutation"

    A reverse version of the Dictionary algorithm :) If you AC-ed "Next Permutation II", copy ...

  8. lintcode :Permutation Index 排列序号

    题目: 排列序号 给出一个不含重复数字的排列,求这些数字的所有排列按字典序排序后该排列的编号.其中,编号从1开始. 样例 例如,排列[1,2,4]是第1个排列. 解题: 这个题目感觉很坑的.感觉这只有 ...

  9. 211. String Permutation【LintCode by java】

    Description Given two strings, write a method to decide if one is a permutation of the other. Exampl ...

随机推荐

  1. 如何给一块新硬盘安装grub,让它成为一个只有一个内核的系统

    (1)先关机 (2)添加一块硬盘 (3)将硬盘分区,/dev/sdb1为boot分区,/dev/sdb2为swap分区, /dev/sdb3为根分区 (4)调整/dev/sdb2的分区类型为82,指定 ...

  2. 找xpath好用的工具(比较少用,针对只能在IE上打开的网站)

    有一些网站只能在IE浏览器里打开,不像firefox那样有好多好用的插件来找元素的xpath,css path等. 当然现在IE也可以,F12出现像firebug那样的窗口,来查看元素. 这里呢在介绍 ...

  3. Laravel 5.4 数据库迁移一次之后就不起作用!

    https://segmentfault.com/q/1010000010806351 我在命令行中生成了一个新的迁移脚本: 当我执行命令:php artisan migrate 时 显示迁移成功,并 ...

  4. Linux服务器启动后只读解决办法

    今天处理一个服务器,远程死活连接不上,只好跑信息中心去看了下服务器. Linux服务器启动之后,提示: give root password for maintenance (or type cont ...

  5. java之静态代理与动态代理

    先看看静态代理是如何操作的 定义接口: public interface Person { public void sayHello(String content, int age); public ...

  6. UVALive - 4975_Casting Spells

    题意很简单,给你一个字符串,要求你求出一个最长的形似于w(wr)w(wr)的最长连续子串的长度.wr表示w的逆序串. 在这里大家很容易就能想到Manacher算法求回文串.没有错,就是这个. 算法的详 ...

  7. HDU5669-Road

    题意 给一个\(n\)个点的图,标号为\(1\)到\(n\),进行\(m\)次连边\((a,b,c,d,w)\): for i in range[a,b]: for j in range[c,d]: ...

  8. 插件-监控页面加载之loading

    查看效果点https://icedjuice.github.io/plug-in/loading/loading.html 简单易用的loading插件,该插件并不是真正的监控页面的资源加载过程,而是 ...

  9. C++解析(28):异常处理

    0.目录 1.C语言异常处理 2.C++中的异常处理 3.小结 1.C语言异常处理 异常的概念: 程序在运行过程中可能产生异常 异常(Exception)与 Bug 的区别 异常是程序运行时可预料的执 ...

  10. P1054 等价表达式

    题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数 ...