解题思路:
为了实现找到一个更大的排列
1、首先i从数组end位置向start位置遍历 找到nums[i]>nums[I-1] 跳出循环
2、如果i==0,还没有跳出循环,说明数组本身是按照降序排序,此时应该输出升序,(升序可以使用双指针法完成)
3、如果在i!=0时能够找到nums[i]>nums[i-1],让j从i的位置向后找比nums[i-1]大的元素,并与其进行交换
4、从i+1开始对后面的数进行快速排序,直至循环结束
源码:
class Solution {
public:
//构建一个快速排序函数
void quick(vector<int>& a,int start,int end)
{
if(start>=end) return;
int i=start;
int j=end;
int temp=a[i];
while(i<j)
{
while(i<j && a[j]>=temp) j--;
while(i<j && a[i]<=temp) i++;
swap(a[i],a[j]);
}
swap(a[i],a[start]);
quick(a,start,i-1);
quick(a,i+1,end);
}
void nextPermutation(vector<int>& nums) {
int N=nums.size();
int i=N-1;//i是从后向前遍历
//遍历找到nums[i]>num[i-1]
while(i>0)
{
if(nums[i]<=nums[i-1]) i--;
else break;
}
//i==0,说明是按照降序排列,应该输出升序,这里使用双指针快速完成升序
if(i==0)
{
int p=0;
int q=N-1;
while(p<=q) swap(nums[p++],nums[q--]);
return;
}
int j=i;
int select=nums[i-1];
while(nums[j]>=select)
{
j++;
if(j==N) break;
}
while(nums[j-1]==select) j--;
swap(nums[i-1],nums[j-1]);
quick(nums,i,N-1);
}
};
Every step of barefoot running deserves to be recorded