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, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

分析

尋找一個數組的下一個字典序排列,如果已經是最大了,就給出最小的字典序排列。
我是從后往前升序尋找,直至找到一個前面的數字大于緊挨的后一個數字,這時為了達到字典序的下一個排列,就需要將該數字與數組之后的一個數值稍大的數字交換,并對后面的數字進行快速排序即可。
C代碼如下,已通過。

void sort(int *a, int left, int right)//快速排序
{
    if(left >= right)/*如果左邊索引大于或者等于右邊的索引就代表已經整理完成一個組了*/
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];
     
    while(i < j)                               /*控制在當組內尋找一遍*/
    {
        while(i < j && key <= a[j])
        /*而尋找結束的條件就是,1,找到一個小于或者大于key的數(大于或小于取決于你想升
        序還是降序)2,沒有符合條件1的,并且i與j的大小沒有反轉*/ 
        {
            j--;/*向前尋找*/
        }
         
        a[i] = a[j];
        /*找到一個這樣的數后就把它賦給前面的被拿走的i的值(如果第一次循環且key是
        a[left],那么就是給key)*/
         
        while(i < j && key >= a[i])
        /*這是i在當組內向前尋找,同上,不過注意與key的大小關系停止循環和上面相反,
        因為排序思想是把數往兩邊扔,所以左右兩邊的數大小與key的關系相反*/
        {
            i++;
        }
         
        a[j] = a[i];
    }
     
    a[i] = key;/*當在當組內找完一遍以后就把中間數key回歸*/
    sort(a, left, i - 1);/*最后用同樣的方式對分出來的左邊的小組進行同上的做法*/
    sort(a, i + 1, right);/*用同樣的方式對分出來的右邊的小組進行同上的做法*/
                       /*當然最后可能會出現很多分左右,直到每一組的i = j 為止*/
}
void nextPermutation(int* nums, int numsSize) {
    if(numsSize==1)
        return;
    int i=numsSize-2,j=numsSize-1,temp=0,p;
    while(i>=0)
    {
        if(nums[i]>=nums[j])
        {
            i--;
            j--;
        }
        else
            break;
    }
    p=j;
    j++;
    while(j<numsSize)
    {
        if(nums[j]>nums[i]&&nums[j]<nums[p])
            p=j;
        j++;
    }
    if(i>=0)
    {
        temp=nums[i];
        nums[i]=nums[p];
        nums[p]=temp;
        sort(nums,i+1,numsSize-1);
    }
    else
        sort(nums,0,numsSize-1);
    return;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容