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).ide

The replacement must be in-place, do not allocate extra memory.spa

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3
1,1,51,5,13d

題目簡要:題目涉及到的是全排列問題,全排列的方法有不少,每種全排列的方法獲得的排列順序不一樣,可是對於一種全排列順序而言,下一個排列指的是咱們所用的排列方法獲得一個排列順序,指定一個排列,它在獲得的排列順序中的下一個排列是什麼?本題目是按字典法進行的。code

如1,2,3進行全排列爲:blog

1,2,3排序

1,3,2it

2,1,3io

2,3,1event

3,1,2

3,2,1

這樣咱們指定一個排列爲1,2,3,那麼它的下一個排列就是1,3,2.

具體作法:以5,4,7,5,3,2爲例,

  5,4,7,5,3,2是一個排列,而且咱們知道一個排列是有規律的,一個排列是有規律的,一個排列能夠分爲兩個部分(其中一個部分能夠爲空),其中部分必定是遞減順序的,而另外一個也是遞減順序的。5,4是遞減的,7,5,4,3是遞增的。

  要想獲得下一個排列,首先咱們必須知道將要變更的值是那個。全排的最後一個序列必定是遞減順序的,因此排列兩部分中遞減順序的哪部分必定不須要改變,因此咱們首先要找到id一個非遞減順序的值,也就是4位置爲1,而後找到要和4交換的值,這個值是要在4以後的那個值中查找,要求是大於4的最小的那個,又由於咱們是從右向作的查找,因此第一個大於4的便可。交換位置後,對位置1後面的序列進行排序。排序的緣由是由字典排序的特性,如1,2,3時,當第一值變爲2的時候爲2,1,3, 2 後面的序列必定是從小到大的排序的,因此當咱們交換兩個值後要進行排序。又由於這個算法不看排序方法的時候時間複雜度爲O(n),因此這個算法的時間複雜度取決於你的排序算法的時間複雜度。

void Sort(int* arr,int low ,int high)
{
    if(low>=high)return ;
    int val=arr[low];
    int i=low;
    int  j=high;
    while(i<j){
        while(i<j&&arr[j]>val)j--;
        arr[i]=arr[j];
        while(i<j&&arr[i]<=val)i++;
        arr[j]=arr[i];
    }
    arr[i]=val;
    Sort(arr,low,i-1);
    Sort(arr,i+1,high);
}
void nextPermutation(int* nums, int numsSize) {
    if(numsSize<=1)return ;
    int i=numsSize-1;
    while(i>0)
    {
        if(nums[i]>nums[i-1])break;
        i--;    
    }
    printf("%d\n",nums[i-1]);
    if(i<=0)Sort(nums,0,numsSize-1);
    else{
        
        for(int j=numsSize-1;j>=i;j--)
            if(nums[i-1]<nums[j]){
                nums[i-1]+=nums[j];
                nums[j]=nums[i-1]-nums[j];
                nums[i-1]-=nums[j];
                Sort(nums,i,numsSize-1);
                break ;    
            }
    }
}
View Code
相關文章
相關標籤/搜索