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 解释了这个现象,解释为特性。