地址:https://leetcode-cn.com/problems/next-permutation/
思路:通过模拟s[1,5,8,6,4,2]的下一个排列,n为其排列长度
1.首先是从末尾向前找首个 r 使 s[r]>s[r-1],翻转s[r,n-1];
即s[r]=s[1]=5,因为对于[8,6,4,2]已经是最大的排列了,因此需要将其转到最小的排列。
2.在s[r,n-1]找首个 i 使 s[i]>s[r-1],交换s[i],s[r-1];
在第一步时s[r,n-1]翻转变成了[2,4,6,8],而s[r-1]=5。再找到首个 i ,s[i]>s[r-1],即为s[i]=6,再交换s[i],s[r-1]的值就行了,此时[5,8,6,4,2]下一个排列就为[6,2,4,5,8]。至于找首个s[i]>s[r-1],是因为s[r-1]=5时,所有s[r-1]<5的已经比其小了,因此找第一个大于5的即可。
Code:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size(),l,r=n-1;
if(r<=0) return;
while(r>0&&nums[r]<=nums[r-1]){
--r;
}
reverse(nums.begin()+r,nums.end());
if(r){
l=r-1;
while(r<n&&nums[r]<=nums[l]){
++r;
}
if(r<n) swap(nums[l],nums[r]);
}
}
};