【力扣hot100题】(098)下一个排列
这题做的真的挺痛苦的……
找到思路做起来还是很痛苦…………
先列几个例子找规律,发现需要从后往前先遍历,找到从后往前第一个递增的那个序号。
就拿51432距离,从后往前第一个递增的是1,因为4->3->2是递减,1->4是递增。
接着记录这个位置,下面只需要考虑这个位置之后的数变化排序就好了。
将后面的数全部倒序(原本是递减,倒序后变为递增),变成51234。
这里如果标记位置为-1(即原本已经是字典序最大的那个数就直接返回)
然后找后几个数中比标记数1大的最小数,因为是递增所以从前往后遍历234,发现比1大的最小数是2,交换1和2,变成52134,即为结果。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=nums.size()-1;
for(i;i>=1;i--){
if(nums[i]>nums[i-1]) break;
}
int j=nums.size()-1;
int x=i-1;
int y=i;
while(i<j){
swap(nums[i],nums[j]);
i++;
j--;
}
if(y==0) return ;
for(y;y<nums.size();y++){
if(nums[y]>nums[x]){
break;
}
}
if(y>=0) swap(nums[x],nums[y]);
}
};