这道题目的思路比较具有跳跃性。难度较大。
最大的数从后往前一定是升序的,比如321
要想发现这个规律,必须看一个比较大的数
// 12385764
我们发现,764这个后缀是升序的,5恰好是分界点,1238是前缀。下一个排列一定是1238前缀不变,764中,将6和5交换
1238 6 567 最后在反序。
画图直观解释
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size()==1) return;
int i = nums.size()-2;
while(i>=0&&nums[i]>=nums[i+1]) i--;
if(i==-1) {
reverse(nums.begin(),nums.end());
return;
}
int j = nums.size()-1;
while(j>=0&&nums[j]<=nums[i]) j--;
swap(nums[i],nums[j]);
reverse(nums.begin()+i+1,nums.end());
}
};