下一个排列
先从后往前找到一个不符合升序的数,记录其下标为pos,则此时nums[pos-1]<nums[pos]。找到pos之后大于nums[pos-1]且为后搬序列的最小值,将其与pos位置的元素交换。按照字典序,需要对交换后的序列再进行调整排序。
所以在找到pos位置之后,先将后续序列进行逆置reverse,此时后半数组为升序,再找到满足大于nums[pos-1]的最小值交换即可。
注意:
1. 进行数组交换时要判断是否越界,需添加if条件
2. 找到最小值后break
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
int pos = n-1;
while(pos>0 && nums[pos]<=nums[pos-1]) pos--;
// cout<<pos<<endl;
reverse(nums.begin()+pos,nums.end());
if(pos>0){
for(int i=pos;i<n;i++){
if(nums[i]>nums[pos-1]){
swap(nums[i],nums[pos-1]);
break;
}
}
}
}
};