刚看到这道题的时候可能觉得有些难度,一开始我的思路是暴力解法,将所有字母排列一一列出来,后来一想觉得时间复杂度太大了,消耗空间也多。
然后我打算找规律,在尝试分析一些例子后找到了直接的规律。
思路是将nums从后往前搜寻,找到前一个数比后一个数小的位置,从这个位置开始改变,寻找后面搜寻过的数中比前一个数字大的最小数,将它移至前面,后面的数全部按从小到大排序排列即可。
代码如下:
class Solution {
public:
void nextPermutation(vector& nums) {
int n=nums.size();
vector num;
int t=n-1;
bool o=0;
for(;t>0;t--){
if(nums[t]>nums[t-1]) {o=1;num.push_back(nums[t]);nums.pop_back();t--;break;}
else {num.push_back(nums[t]);nums.pop_back();}
}
if(o==0){
num.push_back(nums[0]);nums.pop_back();
nums.insert(nums.end(),num.begin(),num.end());
}
else{
num.push_back(nums[t]);nums.pop_back();
for(int i=0;inum[num.size()-1]){nums.push_back(num[i]);num.erase(num.begin()+i);break;}
}
sort(num.begin(),num.end());
nums.insert(nums.end(),num.begin(),num.end());
}
}
};