前言:萌新刷题ing…
-------------------正文分割线-----------------------------
lexicographically:字典序
解:
可以认为是一个串或数字的排序问题,即找出这个数组排序出的所有数中,刚好比当前数大的那个数。
例如,输入“1,2,3” ,可以组成6个数,分别为
123,132,213,231,312,321
根据题目所得,输出的应该是“1,3,2”
同理,如果输入的是“1,3,2”,输出应该是“2,1,3”
输入的是“3,2,1”,输出应该是“1,2,3”
class Solution {
public:
void nextPermutation(vector<int>& nums) {
// 长度为0或1的情况
if(nums.size() == 0 || nums.size() == 1)
return;
// 检查目前的序列有没有找到下一个(升序)序列的可能,即找 右>左 nums[i]>nums[i-1]
// 从右向左开始找,看看有没有左边的数比右边大的情况
int v1 = nums.size() - 1;
while(v1 >= 1 && nums[v1-1] >= nums[v1]){
--v1;
}
// 如果没找到,则把序列反转即为所求
// 例如: 98765 -> 56789
if(v1 == 0){
for(int i = 0; i < nums.size()/2; ++i){
swap(nums[i], nums[nums.size() - 1 - i]);
}
return ;
}
// 有下一个序列,则求之,此时v1等于第一次nums[i-1] < nums[i]的中的i
int v2 = nums.size() - 1;
// 从右向左,找到第一个比nums[i-1]大的数,并交换他俩的位置
while(v2 >= v1){
if(nums[v2] > nums[v1-1])
break;
--v2;
}
swap(nums[v2], nums[v1-1]);
// 直接反转 nums[v1-1:nums.size()+1]
int v3 = (nums.size() - v1)/2;
int i = 0;
while(v3 > 0){
swap(nums[v1+i], nums[nums.size() - 1 - i]);
++i;
--v3;
}
return;
}
};