class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.empty()) return;
for(int i=nums.size()-1;i>=0;i--)
{
int idx = back(nums,i+1,nums[i]);
if(idx>i && idx<nums.size()) {
swap(nums[i],nums[idx]);
sort(nums.begin()+i+1,nums.end());//错误(1)这里没有考虑到,后面要排序才行
return;
}
}
reverse(nums.begin(),nums.end());
return;
}
int back(vector<int>& nums,int begin,int base){
if(begin>=nums.size()) return -1;
int more_min = INT_MAX;
int idx = -1;
for(int i=begin;i<nums.size();i++){
if(nums[i]> base && nums[i]<more_min)
{more_min = nums[i];idx=i;}
}
if(more_min!=INT_MAX)
return idx;
return -1;
}
};
自己先写了一个比较挫的,从后往前遍历,当前下标i,去i+1~结尾找到比当前nums[i]大的最小数,返回下标,然后跟当前nums[i]交换,然后这里犯了个错,交换完之后,i+1~结尾需要一个从小到大的排序,举例132,下一个是213而不是231。然后提交过了,性能比较差。下面看一看答案是怎么写的~