字典序如下: [1]
设P是1~n的一个全排列:p=p1p2…pn=p1p2…pj-1pjpj+1…pk-1pkpk+1…pn
1)从排列的右端开始,找出第一个比右边数字小的数字的序号j(j从左端开始计算),即 j=max{i|pi<pi+1}
2)在pj的右边的数字中,找出所有比pj大的数中最小的数字pk,即 k=max{i|pi>pj}(右边的数从右至左是递增的,因此k是所有大于pj的数字中序号最大者)
3)对换pj,pk
4)再将pj+1…pk-1pkpk+1…pn倒转得到排列p’=p1p2…pj-1pjpn…pk+1pkpk-1…pj+1,这就是排列p的下一个排列。
void nextPermutation(vector<int>& nums) {
if (nums.empty()) return;
int n = nums.size();
int i=n-2;
while (i >= 0 && nums[i] >= nums[i + 1])
--i;
if (i >= 0) {
int j = n - 1;
while (j >= 0 && nums[i] >= nums[j])
--j;
swap(nums[i], nums[j]);
}
int start = i + 1, end = n - 1;
for ( ;start < end; ++start, --end)
swap(nums[start], nums[end]);
return;
}