字典序
- 算法步骤:
- 从后往前找第一个正序对(nums[i] < nums[i+1])。
- 然后找从i+1开始往后找严格大于第i个的最小的那个数,或从后往前找第一个严格大于第i个的数也行,因为后面到i之前的数一定是单减的。记找到的位置为j。
- 交换位置i,j上的数。
- 对i后面的所有数逆序。
每执行一遍这个步骤就会得到一个新的排列,不断重复上述步骤最终会得到最终的一个逆序排列。
class Solution {
public:
bool next_(vector<int>& nums){
int n = nums.size();
int i = n - 1;
do {
--i;
}while (i >= 0 && nums[i] >= nums[i+1]);
if (i >= 0){
int j = i + 1;
while (j < n - 1 && nums[i] < nums[j + 1]) ++j;
swap(nums[i], nums[j]);
reverse(nums.begin() + i + 1, nums.end());
return true;
}
else
return false;
}
vector<vector<int>> permutation(vector<int>& nums) {
vector<vector<int>> res;
if(!nums.size()) return res;
bool flag = true;
sort(nums.begin(), nums.end());
while(flag){
res.push_back(nums);
flag = next_(nums);
}
}
};