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 ...
 
随机推荐
- Iterable,Iterator和forEach
			
Iterable Interface Iterable<T> 方法: Iterator<T> iterator() Returns an iterator over a set ...
 - Java实现的词频统计——功能改进
			
本次改进是在原有功能需求及代码基础上额外做的修改,保证了原有的基础需求之外添加了新需求的功能. 功能: 1. 小文件输入——从控制台由用户输入到文件中,再对文件进行统计: 2.支持命令行输入英文作品的 ...
 - php多维数组排序 3
			
本文实例讲述了php简单实现多维数组排序的方法.分享给大家供大家参考,具体如下: 之前在做一个功能的时候,必须要把数据放到二维数组里并且排序,然后上网找找解决思路, 这时候会用到array_multi ...
 - display:table的几个妙用:垂直居中、浮动……
			
一.为什么不用table系表格元素? 目前,在大多数开发环境中,已经基本不用table元素来做网页布局了,取而代之的是div+css,那么为什么不用table系表格元素呢? 1.用DIV+CSS编写出 ...
 - DateTime Toxxx() 方法获取时间
			
直接上代码 static void Main(string[] args) { DateTime time = DateTime.Now; Console.WriteLine("ToFile ...
 - HDU4045_Machine scheduling
			
题意为要你从编号为1-n的所有机器中间选择出r个机器且每一个机器的编号只差不小于k-1,然后将选择的r个机器分为m组有多少种方案. 其实这题目的两个步骤是相互独立的. 总共的方案数等于选择的方案数乘以 ...
 - ZOJ3067_Nim
			
题目的意思就不说了,典型的取石子的博弈问题. 题目的前半部分就是赤果果的SG函数值异或就可以了,其中Sg函数值就是石子数本身. 但是接下来有个小变换,就是要你输出先手必胜有多少种不同的取法. 首先要想 ...
 - bzoj1211-树的计数
			
题意 给出 \(n\) 和长度为 \(n\) 的数列 \(d\) 表示每个点的度数,问有多少颗满足要求的树. 分析 这题是prufer编码的应用. prufer编码是对一个带标号无根树的刻画,生成方式 ...
 - 题解 P1469 【找筷子】
			
这题真是水 咳咳.. 基本思路:桶排 但是可以剪枝. 剪枝方法: 好几种,可以用set(集合),可以用stack(栈), 也可以像我一样的蒟蒻最大最小值...... 但是作者的毒瘤数据应该不会放过我们 ...
 - Coding and Paper Letter(四十五)
			
资源整理. 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型. 它还支持随机建模以解决参数和模型 ...