小算法-计算下一个排列

2 8 5 3 1

1.从后往前,找到第一个逆序的数 pivot

2.从后往前,找到第一个比pivot大的数 change

3.交换 pivot 和 change的值

4.把pivot这个位置后面的数 reverse,就是 8 5 2 1变成 1 2 5 8

最终为3 1 2 5 8


#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

/*
* num.begin() num is a vector, it means the first element in num
* num.end*() num is a vecotr, it means the last element‘s next element, attention it out of num
* reverse_iterator 按照逆序寻址元素的迭代器
* c.rbegin() 返回一个逆序迭代器,它指向容器的最后一个元素
* c.rend() 返回一个逆序迭代器,它指向容器的第一个元素的前面位置
*/
class Solution{
public:


bool nextPermutation(vector<int> &num)
{
return next_permutation(num.begin(),num.end());
}

template<typename BidiIt>
bool next_permutation(BidiIt first,BidiIt last)
{
const auto rfirst = reverse_iterator<BidiIt>(last);
const auto rlast = reverse_iterator<BidiIt>(first);

auto pivot = next(rfirst);
while(pivot != rlast && *pivot >= *prev(pivot))
{
++pivot;
}

//this is the last permutation, or the next is the same as the begin one
if(pivot == rlast)
{
reverse(rfirst,rlast);
return false;
}
//find the first num great than pivot
auto change = rfirst;
while(*change<=*pivot)
++change;

swap(*change,*pivot);
reverse(rfirst,pivot);
return true;
}

};

int main()
{
vector<int> num;
num.push_back(2);
num.push_back(8);
num.push_back(5);
num.push_back(3);
num.push_back(1);
Solution myS;
myS.nextPermutation(num);
//3 1 2 5 8
return 0;
}

在这个过程中遇到了一个坑:visual C++ debug下 vector::reverse_iterator
current显示是错的,也就是如果 3 1 2 5 8 ,iter指的是1的时候,debug显示的是2.

但是在文章http://www.cnblogs.com/SummerHeart/archive/2008/06/04/1213860.html
解释了这个现象,解释为特性。

小算法-计算下一个排列,布布扣,bubuko.com

时间: 2024-08-01 22:42:53

小算法-计算下一个排列的相关文章

【算法练习题】力扣练习题——数组(4):下一个排列

原题说明:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 原题链接:https://leetcode-cn.com/problems/next-permutation 题意分析: 先给出几个实例 1)123 → 1

【算法题7】寻找下一个排列

来自:LeetCode 37 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 解决方案: 参见博客:Next lexicographical permutation algorithm 代码如下: 1 class

stl 之 next_permutation 求出一个排序的下一个排列的函数 转载

这是一个求一个排序的下一个排列的函数,可以遍历全排列,要包含头文件<algorithm>下面是以前的笔记    与之完全相反的函数还有prev_permutation  (1) int 类型的next_permutation int main(){ int a[3];a[0]=1;a[1]=2;a[2]=3; do{cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<

已知一个排列求下一个排列(NOIP2004P4 火星人 题解)转

题目描述略) 本题题意为求给定长度为 n 的数列的后第 m 个全排列(字典序). 对于一个给定的数列 a[0 .. n-1],求其下一个字典序的全排列算法如下: 从右向左查询最大的下标 i (0 ≤ i ≤ n-1) 使得 a[i] < a[i+1]: 从左向右查询最小的元素 a[j] (i+1 ≤ j ≤ n-1) 使得 a[i] < a[j]: 交换 a[i] 和 a[j]: 逆置翻转 a[i+1 .. n-1]. 算法分析:我们可以发现,第一步求出的 i 下标表示 a[i+1 .. n-

LinkCode 下一个排列、上一个排列

http://www.lintcode.com/zh-cn/problem/next-permutation-ii/# 原题 给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列. 如果没有下一个排列,则输出字典序最小的序列. 样例 左边是原始排列,右边是对应的下一个排列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路(示例:[1,3,5,4,2]) 从后开始往前遍历,找到后一个元素大于前一个元素的时候记录前一个元素的指针(也

c2java 回溯,下一个排列和子集和

穷举:生成所有候选解,然后找出需要的解. 回溯:把解表示成向量,每个分量取自一个有限集合.从部分解开始,每次添加解的一个分量,然后判断如果有可能扩展成完整解则递归下去,否则换成下一个.可以看做是隐式图上的深度优先搜索. 回溯/穷举的复杂度,最坏时和后者一样,通常情形因为不必遍历所有子节点,还是比较快的. 回溯框架: backtrack(a[], k) if a[0,...,k] is a solution output; else k = k + 1; for c: the i-th of ca

LeetCode 31. 下一个排列(Next Permutation)

题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路 由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例,寻找下一个排列的步骤是: 首先找到从后往前第一个升序数对,在此例中即(1

LeetCode:下一个排列【31】

LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 题目分析 什么样的排列将产生下一个更大的数字呢? 观察上面这个图,我们需要将数字 a[i-1]替换为位于其右侧区域的数

leetcode31题:下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 代码如下: public class Solution { public void nextPermutation(int[] nums) { int i = num