力扣:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
//下一个排列:整个按照从小到大
int sign=0,sign1=0;
for(int i=nums.size()-1;i>0;i--)
{
if(nums[i]>nums[i-1])
{
sign=i-1;//因为需要(下一个排列),所以低位(保证是最近的下一个)找到非从小到大的数
break;
}
}
int sign2=0;
for(int i=nums.size()-1;i>sign;i--)
{
if(nums[i]>nums[sign])
{
sign1++;//存在可以换的数(使排列变大的数)
swap(nums[i],nums[sign]);//将下一个最小可以使整体变大的数换来 低于此位置的低位数从小到大排序
sign2=sign;
break;
}
}
//低于此位置的低位数从小到大排序
vector<int>nums1;
for(int i=sign2+1;i<nums.size();i++)
{
nums1.push_back(nums[i]);
}
sort(nums1.begin(),nums1.end());
for(int i=sign2+1,j=0;i<nums.size();i++,j++)
{
nums[i]=nums1[j];
}
//不存在使排列变大的数,说明都是从大到小,直接逆序就是下一个排列
if(sign1==0)
{
sort(nums.begin(),nums.end());
}
}
};
上面使我写的,其实应该是双指针更好解决
标准解法:
class Solution
{
public:
void nextPermutation(vector<int>& nums)
{
int i = nums.size() - 2;
while (i >= 0 && nums[i] >= nums[i + 1])
{
i--;
}
if (i >= 0)
{
int j = nums.size() - 1;
while (j >= 0 && nums[i] >= nums[j])
{
j--;
}
swap(nums[i], nums[j]);
}
reverse(nums.begin() + i + 1, nums.end());
}
};