Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
先解释一下题目的意思。数组中的数字组合起来可以得到一个整数,我们要对数组进行性重新排列,使里面的数字排列得到仅仅比当前数字大的数字组合。如果当前数字就是最大的组合,那就输出最小的组合。
这道题的思路比较简单。只要明确满足nums[c]>nums[c-1]的条件就是需要交换的位置就可以了。之后要把后续的数组按升序排序,找到第一个比nums[c-1]大的数字并与之交换即可。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int c=nums.size()-1; //确定交换位置
bool flag=false; //判断所有数字是否都相同
for(c;c>0;c--){
if(nums[c]!=nums[c-1])
flag=true;
if(nums[c]>nums[c-1]){ //当前数字比前一个大的时候就是需要交换的地方
break;
}
}
if(c>0){ //存在需要交换的地方
for(int i=c;i<nums.size()-1;i++){ //对后续的数组进行升序排序
for(int j=i+1;j<nums.size();j++){
if(nums[i]>nums[j]){
int tmp=nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}
}
for(int j=c;j<nums.size();j++){ //找到比c-1大的第一个数,并交换
if(nums[j]>nums[c-1]){
int tmp=nums[j];
nums[j]=nums[c-1];
nums[c-1]=tmp;
break;
}
}
}
if(c==0 && flag){ //不存在交换条件,且数组里数字不同时,对数组进行排序
int l=0,r=nums.size()-1;
while(l<r){
int swap=nums[l];
nums[l]=nums[r];
nums[r]=swap;
l++;
r--;
}
}
}
};