有好几种方法。第一种常规方法。
class Solution {
public:
void nextPermutation(vector<int> &num) {
int len=num.size();
//1.数组从后往前遍历找到、第一个升序的数为 i-1
if(len>1)
{
int i=len-1;
int index;
int tmp;
int p;
while(i>=1&&num[i]<=num[i-1]) i--;
//2.分两种情况,全部都是降序因此升序排列就是下个排序
if(i<1)
{
sort(num.begin(),num.end());
}
//3.存在升序数标index,因此排序升序数后的数组,从前向后遍历找到第一个比index大的数
else
{
index=i-1;
p=index+1;
sort(num.begin()+p,num.end());
for(;i<len;i++)
{
if(num[index]<num[i]) break;
}
//4.交换两个数,最后再次排序后面的数组
tmp=num[index];
num[index]=num[i];
num[i]=tmp;
sort(num.begin()+p,num.end());
}
}
}
};
第二种方法:
迭代器。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if (nums.begin() == nums.end()) return 0;
vector<int>::iterator itor;
for (itor = nums.begin(); itor != nums.end() && itor + 1 != nums.end(); ++itor) {
while (*itor == *(itor + 1)) {
nums.erase(itor + 1);
if (itor + 1 == nums.end())
break;
}
}
return nums.size();
}
};
第三种。 头文件<algorithm>中next_permutation函数
在C++标准库中还有一个函数next_permutation,其正是用于求一个数字序列的下一个排序。
void nextPermutation(vector<int> &num) {
next_permutation( num.begin(), num.end() );
}
受到下面的启发,十分感谢。点击打开链接