leetcode-31.Next Permutation 下一個排列
題目:
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 and use only constant extra memory. Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
|
實現獲取下一個排列的函式,演算法需要將給定數字序列重新排列成字典序中下一個更大的排列。 如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。 必須原地修改,只允許使用額外常數空間。 以下是一些例子,輸入位於左側列,其相應輸出位於右側列。 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 |
思路:從右往左,入過是順序的,說明已經是最大的排列,只需要逆序(最小)輸出就行。從右往左一直是順序直到某元素A是逆序,那就說明 有更大的 排列,那就再從又往左找第一個比A大的元素B,A和B交換,然後將A之後所有元素逆序就可以了,來看個例子:
1 2 7 4 3 1
它的下個排列是
1 3 1 2 4 7
觀察,若從右往左找到 第一個遞減的元素2,這就說明有更大排列,然後再從右 往左找到第一個大於2的元素3,然後交換2和3,最後將交換後3位置以後的 元素全部逆序 就可以了
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i,j,len=nums.size();
for(i=len-2;i>=0;--i)
{
if(nums[i+1]>nums[i])
{
for(j=len-1;j>i;--j)
if(nums[j]>nums[i])
break;
swap(nums[j],nums[i]);
reverse(nums.begin()+i+1,nums.end());
return ;
}
}
reverse(nums.begin(),nums.end());
}
};