题意理解
输出一个数组的字典序中的下一个更大的排列,如果是最后以后,就输出最小的排列。
问题分析
数组
分三步:
第一步,从后向前遍历,找到第一个降序的数;
第二步,从后向前遍历,找到第一个比降序的数大的数;交换两者的位置;
第三步,从第一个降序的数后面一个数开始到数组末尾,按降序排列。
其他
链接
void nextPermutation(vector<int>& nums) {
int len = nums.size();
if (len <= 1) //数组为空或单个数
return; //不操作
int i = 0;
for (i = len - 2; i >= 0; i --) //逆遍历
{
if (nums[i] >= nums[i + 1]) //升序不变
continue;
else //第一个降序的数
break;
}
cout << "start " << i << endl;
if (i == -1) //没找到这个数,说明是最大的排列数
{
sort(nums.begin(), nums.end()); //翻转
return;
}
int j = 0;
for (j = len - 1; j >= i; j --) //拟遍历
{
if (nums[j] <= nums[i]) //找到第一个比降序的数更大的数
continue;
else //第一个更大的数
break;
}
cout << "j " << j << endl;
if (j != i) //找到了更大的数
{
int tmp = nums[i]; //交换i,j的数
nums[i] = nums[j];
nums[j] = tmp;
}
cout << "i j " << i << '\t' << j << endl;
for (auto a : nums)
{
cout << a << '\t';
}
cout << endl;
cout << " end " << endl;
sort(nums.begin() + i + 1, nums.end()); //对第一个降序的数后面的数开始进行降序排列。
}