您的位置:首页 > 编程语言 > C语言/C++

下一个排列

2015-08-30 10:54 309 查看
        该题的思路是从后向前扫描数组,找到第一对位置 i,j (i < j) 使得 i 位置的值小于 j 位置的值,交换 i 位置和 j 位置的元素值,然后对 i 位置之后的元素进行排序即可。代码如下:

vector<int> nextPermutation(vector<int> &nums) {
// write your code here
int size = nums.size();

//标记数组是否为递减数组
bool flag = false;

//找出从后向前第一个不递增的元素
int i = size - 1;
for(; i > 0; i--){
if(nums[i - 1] < nums[i]){
flag = true;
break;
}
}

//若数组为递减数组,则下一个全排列直接反转数组即可
if(flag == false){
sort(nums.begin(), nums.end());
return nums;
}

//找到第一个比反转元素大的元素
int k = size - 1;
while(nums[k] <= nums[i - 1])
k--;

//交换元素
int tmp = nums[i - 1];
nums[i - 1] = nums[k];
nums[k] = tmp;

//排序剩余元素
sort(nums.begin() + i, nums.end());
return nums;
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 代码