STL-next permutation

过程

从右往左,找到第一个A[i] < A[i+1];

从右往左,找到第一个A[j] > A[i], j > i;

交换A[i] 与 A[j];

将A[j+1]之后的元素逆序。

代码

 1 class Solution {
 2 public:
 3     void nextPermutation(vector<int> &num) {
 4         if(num.size() < 2)
 5             return;
 6         int i, j;
 7         for(i = num.size() - 2; i >= 0 && num[i] >= num[i+1]; --i)  //第一个有序对
 8             ;
 9         if(i < 0)  //已经是逆序
10         {
11             reverse(num.begin(), num.end());
12             return;
13         }
14         for(j = num.size() - 1; num[j] <= num[i]; --j)   //第一个大于A[i]的
15             ;
16         swap(num[i], num[j]);
17         reverse(num.begin() + i + 1, num.end());
18     }
19 };

STL-next permutation,布布扣,bubuko.com

时间: 2024-10-10 00:57:55

STL-next permutation的相关文章

[算法]——全排列(Permutation)以及next_permutation

排列(Arrangement),简单讲是从N个不同元素中取出M个,按照一定顺序排成一列,通常用A(M,N)表示.当M=N时,称为全排列(Permutation).从数学角度讲,全排列的个数A(N,N)=(N)*(N-1)*...*2*1=N!,但从编程角度,如何获取所有排列?那么就必须按照某种顺序逐个获得下一个排列,通常按照升序顺序获得下一个排列. 例如对于一个集合A={1,2,3,},首先获取全排列a1: 1,2,3,:然后获取下一个排列a2: 1,3,2,:按此顺序,A的全排列如下: a1:

leetcode_31题——Next Permutation(STL)

下面摘抄的别人的讲解非常清楚 最近刷leetcode的时候遇见next permutation这道题,感觉挺有意思的一个题目,递归的方法是较简单并且容易想到的,在网上搜了其余的解法,就是std::next_permutation非递归解法,但是让人不是很舒服的就是关于原理的部分,千篇一律的都是摘抄<STL源码剖析>,也就是这样的. 在当前序列中,从尾端往前寻找两个相邻元素,前一个记为*i,后一个记为*ii,并且满足*i < *ii.然后再从尾端寻找另一个元素*j,如果满足*i <

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 replaceme

打印全排列和stl::next_permutation

打印全排列是个有点挑战的编程问题.STL提供了stl::next_permutation完美的解决了这个问题. 但是,如果不看stl::next_permutation,尝试自己解决,怎么做? 很自然地,使用递归的办法: 1. 单个元素的排列只有1个. 2. 多个元素的排列可以转化为: 以每个元素为排列的首个元素,加上其他元素的排列. 有了思路,就可以编码了. 第一个版本: void printAllPermutations(const std::string& prefix, int set[

【LeetCode】031. 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 repla

LeetCode31 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 repla

组合数学 + STL --- 利用STL生成全排列

Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4730    Accepted Submission(s): 2840 Problem Description Now our hero finds the door to the BEelzebub feng5166. He op

STL源码分析--算法

STL源码剖析-算法 在STL中的算法中一些算法是可以根据算法名字来判断算法作用的.所有算法的参数都是迭代器,不过不同的算法调用的迭代器类型也是不同的.多有的STL算法都作用在由迭代器{first,lase)所表示出来的区间上.拷贝(copy)交换(swap)替换(replace)填写(fill)删除(remove)排列组合(permutation)分割(partition)随机重排(random shuffling)排序(sort)计算(accumulate)计数(count)匹配(searc

[leetcode]Next Permutation @ Python

原题地址:https://oj.leetcode.com/problems/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 p

(STL大法) hdu 3283

The Next Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 850    Accepted Submission(s): 597 Problem Description For this problem, you will write a program that takes a (possibly long