题意:给出一个数字排列,如[1, 2, 3],求其下一个字典序排列:[1, 3, 2]
理解: 找到最小的破坏了降序排列的数字子序列,即从序列末位开始找第一个破坏了降序排列的数字子序列。很显然,最大排列即降序排列是找不到这样的子序列的,那么对于能找到这样子序列的序列,都不是最大排列。
程序中求pos就是从数列末尾找到破坏了降序排列的数字的位置。如何得到【pos+降序排列】只大一级的序列呢?显然是找到【降序排列】中比pos大的最小数字的位置,将pos位置的数字与之交换,然后将【降序排列】的数字(仍然满足降序排列)直接reverse
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() == 1)
return;
int pos = nums.size() - 2;
while (pos >= 0 && nums[pos] >= nums[pos + 1])
{
pos--;
}
if (pos >= 0)// not descending
{
int min = nums.size() - 1;
while (min > pos && nums[min] <= nums[pos])
{
min--;
}
swap(nums[pos], nums[min]);
}
//descending
reverse(nums.begin() + pos + 1, nums.end());
}
};
知识点:
- 下一个字典序排列
- cpp标准库的swap
- cpp标准库的reverse