C++提供了next_permutation可以生成全排列,但会超时,《组合数学》提到过生产下一个排列的方法
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int step;
for(int i=nums.size()-2;i>=0;i--)//找到不是逆序的数
{
if(nums[i]<nums[i+1])
{
step=i;//
break;
}
step=-1;//已是逆序
}
if(step==-1)
{
sort(nums.begin(),nums.end());
}
else
{
for(int i=nums.size()-1;i>=step;i--)//从后找,从小到大,第一个大于nums[step]的数与他交换
{
if(nums[i]>nums[step])
{
swap(nums[i],nums[step]);
sort(nums.begin()+step+1,nums.end());
break;
}
}
}
}
};