题目:next permutation
题意:找到一个数组的下一种排列,eg: 12345->12354 54321->12345 1324->1342
思路:找了半天规律还错了。。。看了别人的结题报告,感觉碉堡了
1.从后向前找到第一个升序排列的地方,比如12345的4处,1324的2处,设为第i个位置,如果找到头都没找到,那么就整个全倒置相当于54321->12345的情况
2.从第i个位置的后一个开始向后找,直到找到第一个比i大的数,与位置i的数互换位置
class Solution {
public:
void nextPermutation(vector<int> &num)
{
if(num.empty()) return;
int i;
for(i = num.size()-2;i>=0;i--){
if(num[i]<num[i+1])
break;
}
reverse(num.begin()+i+1, num.end());
if(i==-1) return; //当i=-1时,证明全都倒置了,相当于54321->12345
vector<int>::iterator itr = upper_bound(num.begin()+i+1,num.end(),num[i]);
swap(*itr,num[i]);
}
};